Problem z odczytem prostej bazy danych przez mój program.

0

A więc mój program ma wczytać z klawiatury nazwiska i wiek osób, a następnie zapisać je do pliku. Z zapisem póki co nie ma problemu. Zapisany plik wygląda następująco:

bb 22 
aa 11 
 

Niestety po wczytaniu danych z pliku, a następnie po wydrukowaniu danych na ekran wygląda to już tak

bb 22 
aa 11 
0

Skąd wzięło się tam to zero? Muszę się go pozbyć, bo w innym wypadku będzie problem z dalszym dodawaniem danych do tego pliku.

Tak wygląda funkcja zapisywania:

void zapisz(){
     FILE * pFile;
     pFile = fopen ("myfile.txt","a");
struct wezel *w;
 for  (w=wykaz;w!=NULL;w=w->nast)
{
   fprintf(pFile, "%s %d \n", w->nazwisko,w->wiek);
}
   fclose (pFile);
} 

A tak odczytywania, tutaj na pewno jest błąd:

void odczytaj(){
 FILE * pFile;
  pFile = fopen ("myfile.txt","r");

   struct wezel *w = (struct wezel *)malloc(rozmWezla); 
   struct wezel *root = w;  //wskaźnik ustawiony na pierwszy element
wstawP(w);
 while(EOF!=fscanf(pFile, "%s%d \n", w->nazwisko,&w->wiek))
{
   w->nast = (struct wezel *)malloc(rozmWezla);
   w=w->nast;
}
w->nast = NULL;
free(w);
   fclose (pFile);
  printf ("\n Dane z pliku zostały wczytane. \n");

} 

Wydaje mi się, że może pętla While robi o "jedno okrążenie" za dużo i dlatego wpisuje 0 na końcu, bo nie ma tam już danych.

0

po pętli while zrób free(w) i w = NULL;

0

Co robi wstawP(w);?

    WyczyscListe(&root); // najpierw czyścimy to co było

    for (struct wezel **ins = &root; ; ins = &(*ins)->nast) {
        struct wezel *w = (struct wezel*)malloc(rozmWezla);

        if (EOF != fscanf(pFile, "%s%d", w->nazwisko, &w->wiek)) {
            *ins = w; // wstawiamy element na listę dopiero po odczytaniu
        } else {
            free(w);
            *ins = NULL; // zakańczamy listę NULL'em
            break;
        }
    }

Nie nullowałeś ostatniego 'nast'.

w->nast = NULL;
free(w);
to nie o to 'nast' chodzi. Jak widać ta porcja pamięci w którą wpisałeś NULL jest zwalniana.

Również nie brałeś pod uwagę sytuacji w której wczytywany plik jest pusty.

// EDIT
Jeśli podwójny wskaźnik jest za mało zrozumiało to daję wersję z "poprzednikiem":

struct wezel *poprzedni = NULL;

do {
    struct wezel *w = (struct wezel*)malloc(rozmWezla);

    if (EOF == fscanf(pFile, "%s%d", w->nazwisko, &w->wiek)) {
        free(w);
        w = NULL;
    }

    if (poprzedni == NULL) {
        root = w;
    } else {
        poprzedni->nast = w;
    }
    
    poprzedni = w;
}
while (poprzedni != NULL);
0

Tak wygląda fragment z wstawianiem:

void wstaw(){ 
    struct wezel *w = (struct wezel *)malloc(rozmWezla); 
    printf("imie, nazwisko, waga, wzrost: "); 
    scanf("%s%s%d%d",w->imie,w->nazwisko,&w->waga,&w->wzrost); 
    wstawP(w); 
} 
 void wstawP(struct wezel *nowy){ 
    // wstaw na poczatek 
    nowy->nast = wykaz; 
    if (wykaz!=NULL) wykaz->pop = nowy; 
    nowy->pop = NULL; 
    wykaz = nowy; 
  }

Chce, żeby od razu przy wstawianiu sortowało mi dane wedle wagi.

Jak wstawić ten algorytm w pseudokodzie do mojego programu?:

0. Insert_sort(A, n)                     
1.    for i=2 to n :                                     
2.       klucz = A[i]
3        > Wstaw A[i] w posortowany ciąg A[1 ... i-1]                
4.       j = i - 1                                       
5.       while j>0 and A[j]>klucz:                       
6.          A[j + 1] = A[j]              
7.          j = j - 1                    
8.       A[j+1] = klucz 

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