zapisywanie i wczytywanie listy jednokierunkowej z pliku [C]

0

Cześć, mam problem, stworzyłem listę jednokierunkową i nie mogę przebrnąć przez zapis oraz odczyt z pliku, coś cały czas jest nie tak, mimo to, że program wszystko kompiluje, nie widzę nigdzie swojego błędu. Poprosiłbym o pomoc. Wklejam część kodu, która jest używana do tych funkcji.

typedef struct zadanie
{
 
       char tresc_zadania[200];
       int rok, miesiac, dzien, godzina, priorytet;
       struct zadanie* next;
              } zadanie ;
void dodaj(zadanie** lista, zadanie* nowe)
{
     nowe->next=NULL;
 
     if((*lista)==NULL)
     {
      *lista = nowe;
                     }
     else
     {
         zadanie* wsk = *lista;
         while(wsk->next != NULL)
         {
              wsk = wsk->next;
            }
         
         wsk->next = nowe;
     }  
 }
void zapisywanie(zadanie* lista)
{
    char nazwa_pliku_zapisywanie[30];
    zadanie* wsk = lista;
    printf("Podaj nazwe pliku do zapisania: ");
    scanf("%s", nazwa_pliku_zapisywanie);
    FILE *plik = fopen(nazwa_pliku_zapisywanie, "w+b");
    if(plik==NULL)
    {
        printf("Nie udalo sie otworzyc pliku: %s \n", nazwa_pliku_zapisywanie);
    }
    else
    {
        while (wsk!=NULL)
        {
            fwrite(wsk->tresc_zadania, sizeof(wsk->tresc_zadania), 1, plik);
            fwrite(&(wsk->rok), sizeof(wsk->rok), 1, plik);
            fwrite(&(wsk->miesiac), sizeof(wsk->miesiac), 1, plik);
            fwrite(&(wsk->dzien), sizeof(wsk->dzien), 1, plik);
            fwrite(&(wsk->godzina), sizeof(wsk->godzina), 1, plik);
            fwrite(&(wsk->priorytet), sizeof(wsk->priorytet), 1, plik);
            wsk=wsk->next;
        }
    }
    fclose(plik);
    printf("Zapisywanie ukonczone pomyslnie! \n");
}
void wczytywanie(zadanie** lista)
{
    char nazwa_pliku_wczytywanie[30];
    printf("Podaj nazwe pliku z ktorego chcesz wczytac dane  : ");
    scanf("%s", nazwa_pliku_wczytywanie);
   
    FILE *plik = fopen(nazwa_pliku_wczytywanie, "w+b");
    if (plik==NULL)
    {
        printf("Nie udalo sie otworzyc pliku: %s\n", nazwa_pliku_wczytywanie);
    }
    else
    {
        while(1)
        {
            zadanie *nowe=(zadanie*)malloc(sizeof(zadanie));
            fread(nowe->tresc_zadania, sizeof(nowe->tresc_zadania),1,plik);
            fread(&nowe->rok, sizeof(nowe->rok),1,plik);
            fread(&nowe->miesiac, sizeof(nowe->miesiac),1,plik);
            fread(&nowe->dzien, sizeof(nowe->dzien),1,plik);
            fread(&nowe->godzina, sizeof(nowe->godzina),1,plik);
            fread(&nowe->priorytet, sizeof(nowe->priorytet),1,plik);
            if(feof(plik)) break;
            dodaj(lista, nowe);
        }
        fclose(plik);
        printf("Wczytywanie zakonczone pomyslnie");
   
        }
}        
0
  1. By wiedziec, co żle jest, potrzebny byłby jeszcze fragment pliku, który wczytujesz...
  2. za stosowanie pętli nieskończonej z breakiem w srodku, zamiast warunku stopu, zawsze po łapach!!!
  3. używanie danych w postaci int, którego wielkość jest zależna od kompilatora, a nawet od ustawień kompilacji, przy wczytywaniu bezpośrednim do nich danych binarnych nie jest najlepszym pomysłem
0
  1. w sensie poprzez funkcje zapisywanie mam zamiar zapisywac moje struktury, po to by moc je potem wczytac za pomoca funkcji wczytywanie, plik ma byc domyslnie pusty.
  2. czyli lepiej w srodku while'a dac warunek z feofem? na tym forum przeczytalem ze wlasnie petla nieskonczona dopoki plik sie nie skonczy.
  3. w calym programie edytowanie, wyszukiwanie, czy usuwanie struktur opieram na porownywaniu intow, stad jest prosto. Aby umozliwic funkcje zapisywania lepiej zamienic wszystko na chary?
0
  1. ok juz widzę błąd, otwierasz plik do odczytu jako "w+b", a chciałeś zapewne "r+b"
  2. to zły zwyczaj - kod ma byc jednocześnie dokumentacją, nieskończona pętla sugeruje, że ma się wykonywać do końca działania programu. pomijam juz, że w rozpędzie wlaśnie dałeś przerawnie pętli bez zapisu utworzonego nowego elementu
  3. porównywanie intów spoko, ale jesli stworzysz plik, a później uruchomisz go programem skompilowanym z innymi parametrami, to się zdziwisz, że nagle nie wczytuje, do intów o stałej wielkości są typy całkowite typu int32_t itp
0

wydaje mi sie ze zapisywanie w pliku tekstowym nie powinno przeszkadzac, dzieki za wychwycenie bledu z "w" zamiast "r", co do tego rozpedu, to po prostu zamiana

 if(feof(plik)) break;
 dodaj(lista, nowe);

w kolejnosci tych linijek pomoze prawda?

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