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