Projekt baza danych w języku C

0

Program-baza danych.
Program miał umożliwiać dodawanie własnych rekordów ręcznie, z pliku, zapis danych w pliku, usuwanie rekordów.
Błędy:

  1. nie działająca funkcja usun(E0020 identyfikator "tytul" jest niezdefiniowany projekt_1 )
  2. przy ręcznym dodaniu rekordu i wyświetleniu go pojawia się tylko pozycja tytul
  3. po użyciu funkcji dodania rekordów z pliku program wyłącza się
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef N
#define N 50
#endif

typedef struct nagranie {
    char tytul[50];
    char wykonawca[50];
    char rok[10];
    char gatunek[50];
    char wytwornia[50];
    int strona;
} nagranie;

void menu(int x)
{
    if (x == 1) {
        printf("Wprowadź numer operacji i potwierdź klawiszem enter.\n");
    }
    if (x == 0) {
        printf("Wybierz co chcesz zrobić dalej:\n");
    }
    printf("1. Dodaj rekordy.\n");
    printf("2. Dodaj rekordy z pliku.\n");
    printf("3. Wyswietl dane. \n");
    printf("4. Usun rekord.\n");
    printf("5. Zapisz rekordy w pliku.\n");
    printf("Wcisnij 'x' aby wyjść.\n");
}

void add(nagranie nagrania[N], int* next)
{
    char end[2] = "\0";
    char newline[2] = " ";
    int j;
    int i = (*next);
    int ilosc = 0;
    int enter;
    int count_newline;
    printf("Wprowadź po kolei tytul, wykonawce, rok wydania, gatunek i wytwornie. Każdą informację potwierdź klawiszem enter.\n");
    fgets(nagrania[i].tytul, 50, stdin);
    count_newline = strcspn(nagrania[i].tytul, "\n");
    for (j = count_newline; j < 49; j++) {
        nagrania[i].tytul[j] = newline[0];
    }
    nagrania[i].tytul[j] = end[0];
    fgets(nagrania[i].wykonawca, 50, stdin);
    count_newline = strcspn(nagrania[i].wykonawca, "\n");
    for (j = count_newline; j < 49; j++) {
        nagrania[i].wykonawca[j] = newline[0];
    }
    nagrania[i].wykonawca[j] = end[0];
    fgets(nagrania[i].rok, 10, stdin);
    count_newline = strcspn(nagrania[i].rok, "\n");
    for (j = count_newline; j < 40; j++) {
        nagrania[i].rok[j] = newline[0];
    }
    nagrania[i].rok[j] = end[0];
    fgets(nagrania[i].gatunek, 50, stdin);
    count_newline = strcspn(nagrania[i].gatunek, "\n");
    for (j = count_newline; j < 49; j++) {
        nagrania[i].gatunek[j] = newline[0];
    }
    nagrania[i].gatunek[j] = end[0];
    fgets(nagrania[i].wytwornia, 50, stdin);
    count_newline = strcspn(nagrania[i].wytwornia, "\n");
    for (j = count_newline; j < 49; j++) {
        nagrania[i].wytwornia[j] = newline[0];
    }
    nagrania[i].wytwornia[j] = end[0];
    scanf_s("%d", &nagrania[i].strona);
    enter = getchar();
    (*next)++;
}

void open(nagranie nagrania[N], int* next)
{
    char pom[6];
    char nazwa_pliku[100];
    int j;
    int i = (*next);
    int enter;
    int ilosc;
    int newline;
    printf("Wpisz nazwę pliku z danymi.");
    scanf_s("%s", nazwa_pliku);
    enter = getchar();
    FILE* file = fopen_s(nazwa_pliku, "crt_fopen_s.c", "r");
    if (feof(file) != 0) {
        perror("Plik jest pusty.\n");
    }
    else {
        fscanf_s(file, "%d", &ilosc);
        enter = fgetc(file);
        if (ilosc == 0 || i + ilosc > N) {
            printf("Nie można wprowadzić tylu rekordów.\n");
        }
        else {
            for (j = 0; j < ilosc; j++) {
                fgets(pom, 6, file);
                fgets(nagrania[i + j].tytul, 50, file);
                fgets(nagrania[i + j].wykonawca, 50, file);
                fgets(nagrania[i + j].rok, 10, file);
                fgets(nagrania[i + j].gatunek, 50, file);
                fgets(nagrania[i + j].wytwornia, 50, file);
                fscanf_s(file, "%d", &nagrania[i + j].strona);
                newline = fgetc(file);
            }
            (*next) = i + j;
        }
    }
    fclose(file);
}

void wyswietl1(nagranie nagrania[N], int i)
{
    printf("%-5d", i + 1);
    printf("%s", nagrania[i].tytul);
    printf("%s", nagrania[i].wykonawca);
    printf("%s", nagrania[i].rok);
    printf("%s", nagrania[i].gatunek);
    printf("%s", nagrania[i].wytwornia);
    printf("%d\n", nagrania[i].strona);
}

void wyswietl(nagranie nagrania[N], int* next)
{
    int i;
    for (i = 0; i < (*next); i++) {
        wyswietl1(nagrania, i);
    }
}

void zapisz(nagranie nagrania[N], int* next)
{
    char nazwa_pliku[50];
    int i;
    int enter;
    printf("Wpisz nazwę pliku, w którym mają się pojawić dane.\n");
    scanf_s("%s", nazwa_pliku);
    enter = getchar();
    FILE* file = fopen_s(nazwa_pliku, "crt_fopen_s.c", "w+");
    fprintf(file, "%d\n", (*next));
    for (i = 0; i < (*next); i++) {
        fprintf(file, "%-5d", i + 1);
        fprintf(file, "%s", nagrania[i].tytul);
        fprintf(file, "%s", nagrania[i].wykonawca);
        fprintf(file, "%s", nagrania[i].rok);
        fprintf(file, "%s", nagrania[i].gatunek);
        fprintf(file, "%s", nagrania[i].wytwornia);
        fprintf(file, "%d", nagrania[i].strona);
        fprintf(file, "\n");
    }
    fclose(file);
}

void usun(nagranie nagrania[N], int* next)
{

    int n, i;
    scanf_s("%s", tytul);
    for (i = 0; i < n; i++) {
        if (strcmp(tytul, nagrania[i].tytul) == 0) {
            nagrania[i] = nagrania[n - 1];
            n--;
            printf("usunieto\n");
        }
    }
}

int main()
{
    setlocale(0, "");
    int i = 0;
    int enter;
    int* next = malloc(sizeof(int));
    (*next) = 0;
    char operation;
    nagranie nagrania[N];
    menu(1);
    scanf_s("%c", &operation);
    enter = getchar();
    while (operation != 'x') {
        if (operation == '1') {
            if (*(next) < N) {
                add(nagrania, next);
            }
            else {
                printf("Baza jest pełna, najpierw usuń rekordy.\n");
            }
            menu(0);
        }
        if (operation == '2') {
            if ((*next) < N) {
                open(nagrania, next);
            }
            else {
                printf("Baza jest pełna, najpierw usuń rekordy.\n");
            }
            menu(0);
        }
        if (operation == '3') {
            if ((*next) == 0) {
                printf("W bazie nie ma żadnych rekordów.\n");
            }
            else {
                printf(nagrania, next);
            }
            menu(0);
        }
        if (operation == '4') {
            if ((*next) == 0) {
                printf("W bazie nie ma żadnych rekordów.\n");
            }
            else {
                usun(nagrania, next);
            }
            menu(0);
        }

        if (operation == '5') {
            if ((*next) == 0) {
                printf("Baza jest pusta, nie ma rekordów do zapisania.\n");
            }
            else {
                zapisz(nagrania, next);
            }
            menu(0);
        }

        scanf_s("%c", &operation);
        enter = getchar();
    }
    printf("Kociec.\n");
    free(next);
    return 0;
}
2

nie działająca funkcja usun(E0020 identyfikator "tytul" jest niezdefiniowany projekt_1 )

No tak, nie ma w niej takiej zmiennej, ani nie ma takiej zmiennej globalnej, a jednak próbujesz w 164. linijce scanf_s("%s", tytul); wczytywać do niej stringa. Musisz taką zmienną utworzyć, zanim to będzie działać…

Co do reszty — program jest za duży, by go ogarnąć w moment przy użyciu statycznej analizy kodu, a debugger masz taki sam, jak i ja, więc… 🤷 Popróbuj samemu i jak Ci się uda zredukować (a może i nawet rozwiązać) problem, to może wtedy będzie Ci jak lepiej pomóc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1