PDA

Visualizza versione completa : c: fread legge troppo


nixie82
07-06-2003, 16.49.28
Ciao ragazzi, il mio problema questo:
ho creato un programma che gestice una lista e la salva su file (fwrite) per poi ricaricarla (fread)... all'atto di ricaricarla, l'ultimo elemento della lista viene caricato 2 volte, nonostante nel file binario sia presente una sola volta... La funzione di caricamento e la seguente:

Lista Carica (char* nomefile, int* n) {
FILE *f;
long int p;
TStudente studente;
Lista l = NULL;
*n = 0;
f = fopen (nomefile, "rb");
if (f != NULL) {
while (!feof(f)) {
fread (&studente, sizeof(TStudente), 1, f);
p = ftell (f);
printf ("\nfile = %d\n",p);
l = InserimentoOrdinato (l, studente);
*n=*n+1;
}
fclose (f);
}
return l;
}

ho aggiunto anche ftell per vedere come si spostava il puntatore e ho notato che arrivato all'ultimo elemento, invece di avanzare restava li, caricandolo una seconda volta pr poi uscire... Mi sapete aiutare? VI PREGOOOOO!!! grazie!!!

PS: tutto io stato compilato sia con gcc che con borland (Linux e windows)

P8257 WebMaster
07-06-2003, 17.00.43
Probabilmente la colpa della stessa "feof".. un po' "ostica" certe volte .. utilizza la stessa "ftell" per testare la posizione del puntatore sul file... oppure utilizza "fread" direttamente per testare il ciclo

Bye :cool:

nixie82
07-06-2003, 22.54.40
ma io non so a priori ne la lunghezza del file, ne quanti elementi sono stati inseriti precedentemente... li dovrei leggere tutti finche non finiscono, cioe finche non si arriva a EOF... Che posso usare?

P8257 WebMaster
08-06-2003, 03.14.25
Ci sono due strade percorribili secondo me ..

la prima che puoi rovesciare il ciclo utilizzando con feof il costrutto do-while ..anziche while..

la seconda che potresti appunto usare fread per testare il ciclo fino a quando il valore di ritorno non diverso (minore) di sizeof(TStudente).. in questo modo dovresti "accorgerti" di una fallita lettura o della fine del file..

Bye :cool:

nixie82
08-06-2003, 19.55.28
Allora, check this:

Lista Carica (char* nomefile, int* n) {
FILE *f;
TStudente studente;
char p;
Lista l = NULL;
*n = 0;
f = fopen (nomefile, "rb");
if (f != NULL) {
while (p = fread (&studente, sizeof(TStudente), 1, f)) {
l = InserimentoOrdinato (l, studente);
*n=*n+1;
}
}
return l;
}

Finalmente ha funzionato... Grazie per l'idea di usare fread, mi hai messo sulla buona strada :-) Thank you e continuate cosi...

Dario