Visualizzazione dei risultati da 1 a 2 su 2

Hybrid View

  1. #1

    [C]Lettura da file binario rovintata. Problema puntatore?

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,467
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.