PDA

Visualizza la versione completa : [C] File Binari


darth fener
31-10-2009, 20:39
Ciao a tutti. Ho un problema con i file binari e con l'feof (praticamente non si ferma alla fine del file).



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define dmaxS 100
#define dmax 3

typedef struct record{
char cognome[dmaxS];
char nome[dmaxS];
char sesso;
int anno;
}record;

int main(){
record elenco[dmax];
record elenco2[dmax];
int dim;
FILE *fp;
int i;
for(i=0;i<dmax;i++){
printf("%d)\n",i);
printf("Cognome: ");
gets(elenco[i].cognome);
printf("Nome: ");
gets(elenco[i].nome);
printf("Sesso: ");
scanf("%c",&(elenco[i].sesso));
fflush(stdin);
printf("Anno di nascita: ");
scanf("%d",&(elenco[i].anno));
fflush(stdin);
printf("\n");
}
fp = fopen("prova.bin","wb");
if(fp != NULL){
for(i=0;i<dmax;i++){
fwrite(elenco[i].cognome,sizeof(char),dmaxS,fp);
fwrite(elenco[i].nome,sizeof(char),dmaxS,fp);
fwrite(&(elenco[i].sesso),sizeof(char),1,fp);
fwrite(&(elenco[i].anno),sizeof(int),1,fp);
}
fclose(fp);
fp = fopen("prova.bin","rb");
if(fp != NULL){
i=0;
while(!feof(fp)){ // non si ferma al terzo ciclo
fread(elenco2[i].cognome,sizeof(char),dmaxS,fp);
fread(elenco2[i].nome,sizeof(char),dmaxS,fp);
fread(&(elenco2[i].sesso),sizeof(char),1,fp);
fread(&(elenco2[i].anno),sizeof(int),1,fp);
i++;
}
dim = i;
fclose(fp);
for(i=0;i<dim;i++){
printf("\n");
puts(elenco2[i].cognome);
puts(elenco2[i].nome);
printf("%c\n",elenco2[i].sesso);
printf("%d\n",elenco2[i].anno);
}
}
}
system("pause>nul");
return 0;
}

ant_alt
31-10-2009, 20:54
non l il problema, che nel while alla riga 47 incrementi i una volta in pi: i alla fine vale 4, quindi nel for stampi caratteri casuali alla fine.
in effetti non ho capito il perch dell'istruzion alla riga 54 dim=i, quando le strutture sono allocate staticamente con dmax = 3.

quindi correggi la riga 56: for(i=0;i<dmax;i++) :)

darth fener
31-10-2009, 21:41
Scusa, ma se ho tre elementi con i che parte da 0:
leggo il primo, i=1
leggo il secondo, i=2
leggo il terzo, i=3
dim = 3. Dove sarebbe l'errore?
ho messo apposta il while per verificare che ne leggesse solo 3

ant_alt
31-10-2009, 21:59
Originariamente inviato da darth fener
Scusa, ma se ho tre elementi con i che parte da 0:
leggo il primo, i=1
leggo il secondo, i=2
leggo il terzo, i=3
dim = 3. Dove sarebbe l'errore?
ho messo apposta il while per verificare che ne leggesse solo 3

che bello essere contestati :madai!?:
scusami ma prima di postare hai provato a stampare la variabile i dopo il while?

il while questo
leggo il primo, i=1
leggo il secondo, i=2
leggo il terzo, i=3
leggo ancora: le 4 fread leggono eof, i=4
la condizione del while solo ora non soddisfatta e quindi esco

darth fener
31-10-2009, 22:01
Si, 4 perch non si ferma quando si dovrebbe fermare con l'feof(),(praticamente l'errore che ho indicato fra i commenti). I cicli come puoi vedere non dipendono dalla i, ma dallo stato del file (se sono alla fine o no). Se prima ho messo 3 strutture, perch dopo aver letto 3 strutture mi dice che il file non ancora finito? Secondo me, una volta letto il terzo si dovrebbe fermare perch il file finito, invece va avanti portando l'indice a 4...

ant_alt
31-10-2009, 22:12
ti ho spiegato nel post sopra come gira il while, non c' nessun errore. devi solo modificare la condizione del for che stampa

darth fener
31-10-2009, 22:13
Ho trovato l'errore, era nel while, proprio l'feof(), comunque adesso ho risolto

ant_alt
31-10-2009, 22:19
bah :madai!?:

darth fener
31-10-2009, 22:21
Originariamente inviato da ant_alt
bah :madai!?: :madai!?:

feof() ti dice se stata raggiunta la fine del fine(va a guardare se hai raggiunto il carattere EOF), nei file binari EOF non c' e quindi andava avanti.
Per sapere quando ho raggiunto la fine del file, devo controllare il numero di elementi letti dalla fread()...

MItaly
31-10-2009, 23:34
Originariamente inviato da darth fener
:madai!?:

feof() ti dice se stata raggiunta la fine del fine(va a guardare se hai raggiunto il carattere EOF), nei file binari EOF non c' e quindi andava avanti.
Non vero, feof verifica se il bit di EOF associato allo stream settato, e il bit in questione viene impostato quando una lettura dal file non andata a buon fine perch non ci sono pi dati da leggere.

Loading