Ciao a tutti, ho l'esigenza di scorrere un file binario leggendo dei record e, se questi record soddisfano particolari richieste, ritornare il valore true.
Premetto che il file non è rovinato, ed eseguendo il codice di lettura si riesce a leggere il contenuto integralmente.
Il problema che sorge è che i dati appaiono come "rovinati", nel senso che dopo la seconda lettura si perdono ogni volta i primi tre caratteri dei tre campi della struct salvata.
Il codice è il seguente
Per farvi capire meglio, questo è un esempio di file letti bene:codice:fread(&rec,sizeof(struct movimento),1,fp); /*lettura struct*/ PuliziaBuffer(); while(!feof(fp)) { PuliziaBuffer(); strcpy(app,rec.data); stampaMov(rec); PuliziaBuffer(); if((rec.visible==true)&&(strcmp(rec.nome,nome)==0)&&(julianDate(app)>=soglia)) { PuliziaBuffer(); fclose(fp); return(true); /*restituisco vero*/ } PuliziaBuffer(); fread(&rec,sizeof(struct cliente),1,fp); /*lettura struct*/ }
Cattura.jpg
E questo è ciò che leggo quando va in esecuzione il codice:
Cattura1.jpg
Da dire anche che l'ultima struct non viene letta. Ciò che mi viene in mente è che il puntatore si rovini, ma non riesco a cavare un ragno dal buco.
Non so se è necessario, ma posto anche l'intera procedura, vedi mai che l'errore sia sopra e io non me ne sia accorto.
Grazie in anticipo per l'interessamento e l'aiutocodice:bool checkNameMov(char nome[])/*metodo per controllare se il nome è presente in almeno un campo*/ { FILE *fp; fp=fopen("filemovimenti.dat", "r+b");/*Apertura file in modalita lettura e binario*/ if(fp==NULL) { return(false); } PuliziaBuffer(); /*questione attività cliente: un cliente viene considerato "inattivo", o comunque sia da eliminare dalla lista, se non è stato effettuato almeno un movimento VISIBILE negli ultimi CINQUE anni*/ char app[11]; char day1[2]; char month1[2]; char year1[6]; char today[50]; char terminatore[2]="-"; int year,soglia; PuliziaBuffer(); time_t rawtime; /*data di sistema*/ struct tm *info; time(&rawtime); info=localtime(&rawtime); strftime(day1,3,"%d",info);/*acquisisco il giorno */ strcat(today,day1); /*concateno*/ strcat(today,terminatore); strftime(month1,3,"%m",info);/*acquisisco il mese */ strcat(today,month1); /*concateno*/ strcat(today,terminatore); strftime(year1,6,"%Y",info);/*acquisisco l'anno */ PuliziaBuffer(); year=atoi(year1);/*trasformo la stringa in intero*/ year=year-5;/*levo 5 anni dalla data corrente*/ itoa(year,year1,10); /*ritrasformo l'intero e stringa*/ strcat(today,year1); /*ottengo la data di oggi relativa a cinque anni fa*/ PuliziaBuffer(); soglia=julianDate(today); struct movimento rec; int cont=0; PuliziaBuffer(); fread(&rec,sizeof(struct movimento),1,fp); /*lettura struct*/ PuliziaBuffer(); while(!feof(fp)) { PuliziaBuffer(); strcpy(app,rec.data); stampaMov(rec); PuliziaBuffer(); if((rec.visible==true)&&(strcmp(rec.nome,nome)==0)&&(julianDate(app)>=soglia)) /*se il nome è presente ed il cliente non è nascosto e il movimento è stato effetuato negli ultimi cinque anni*/ { PuliziaBuffer(); printf(" %s c'è", rec.nome); fclose(fp); return(true); /*restituisco vero*/ } PuliziaBuffer(); fread(&rec,sizeof(struct cliente),1,fp); /*lettura struct*/ } fclose(fp); return(false); /*se scorre tutto e non trova niente restituisco falso*/ }![]()

Rispondi quotando