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
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*/
}
Per farvi capire meglio, questo è un esempio di file letti bene:
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.
codice:
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*/
}
Grazie in anticipo per l'interessamento e l'aiuto