PDA

Visualizza la versione completa : [C]Lettura da file binario rovintata. Problema puntatore?


LorenzoP
27-09-2015, 23:44
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



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:
26394

E questo ci che leggo quando va in esecuzione il codice:
26395

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.


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 :)

oregon
28-09-2015, 00:10
Il codice postato in modo confuso.

Prova a postare TUTTO il codice in una sola volta, da copiare e incollare per compilarlo senza errori n parti mancanti. Mi riferisco ovviamente al codice che causa il problema.

Inoltre, facci scaricare il file dei dati da testare.

Loading