lista jednokierunkowa, czytanie danych

0

Witam, chciałbym żeby funkcja pobierała dane z pliku txt i zapisywała je potem do listy jednokierunkowej, niestety nie do końca wiem jak to zrobić.

typedef struct Ksiazka
{
    char autor[max];
    char tytul[max];
    struct Ksiazka *next;
};

void BOOK_2()
{
    FILE * ksiazki = fopen("lista_ksiazek.txt","r");

    struct Ksiazka * head = NULL;
    struct Ksiazka * current = head;

    char autor[max];
    char tytul[max];

    current = malloc(sizeof(struct Ksiazka));

    while(fscanf(ksiazki,"%s %s",autor,tytul) != EOF);
    {
        fscanf(ksiazki,"%s %s %s",autor,tytul,rok_wydania);
        strcpy(current->autor,autor);
        strcpy(current->tytul,tytul);
        current = current->next;
        current = malloc(sizeof(struct Ksiazka));
        printf("%s %s %s",current->autor,current->tytul,current->rok_wydania);
        current->next = NULL;

    }

}
1

W tej chwili Twoja funkcja BOOK_2 robi wszystko: wczytuje plik, przetwarza go, tworzy listę jednokierunkową (...) - jest przez to nieczytelna i bardzo ciężko szuka się w niej błędu (jak sam zresztą zauważyłeś: "coś" nie działa, lecz nie wiadomo w zasadzie co zawodzi).

Dlatego IMO na sam początek warto podzielić program na dwie niezależne części: odpowiedzialną za zarządzanie listą jednokierunkową oraz odpowiedzialną za przetwarzanie danych z pliku.

Skupmy się na początek na funkcjonalności listy jednokierunkowej - aby móc zarządzać taką listą, jakich funkcji będziesz potrzebował? Jakie operacje będziesz chciał wykonywać na tej liście biorąc pod uwagę Twoje zadanie?

Jeszcze nic nie koduj, przemyślmy najpierw architekturę.

0

Więc tak, muszę otworzyć plik txt, mieć funkcje która przeczyta mi dane z tego pliku, potem następna która stworzy listę i zostaje jeszcze przekazanie wartości przeczytanych do utworzonej listy.
Potem wartości z listy będą mi służyły do wypisywania statystyk na temat tych książek (znajdujących się w pliku txt.) np ( wypisanie osób które posiadają poszczególne książki i zapisanie tego do pliku tekstowego.)

1

Q: Jakie operacje będziesz chciał wykonywać na tej liście biorąc pod uwagę Twoje zadanie?
A: muszę otworzyć plik txt, mieć funkcje która przeczyta mi dane z tego pliku (...)

Te dwa akurat nie odpowiadają na moje pytanie (które dotyczyło wyłącznie listy), lecz niech będzie ;-)

Co powiesz na taki design w wersji podstawowej?

typedef struct Books {
  Book *head;
};

Books* books_create() {
  /* ... */
}

void books_add(Books *list, Book book) {
  /* ... */
}

Pamiętaj: zupełnie nie interesuje nas teraz skąd będą wczytywane książki - mamy mieć komplet funkcji do operacji na liście książek i tyle.

0

Przyznam ,że wygląda dużo lepiej :)

0

W tym miejscu kompilator ma problem, nie powinniśmy dać void na początku

Books* books_create() {
  /* ... */
}
1

Kompilator ma problem czy Ty? ;-)
Tak czy siak: nie, nie powinniśmy. Zadaniem tej funkcji jest utworzenie nowej, pustej listy (pustej struktury Books) i zwrócenie wskaźnika do niej.

0

Rozumiem zamysł, postaram się coś z tym zrobić, dziekuję za pomoc.

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