Trattamento dei file su C

di il
5 risposte

Trattamento dei file su C

Salve a tutti, in questa esercitazione dovrei scrivere un programma che tratti su una agenda contenente vari contatti telefonici. Il file dell'agenda deve essere .bin. Il mio problema arriva nel momento in cui devo scrivere sul file nuovi contatti, inizialmente aprivo il file in "a" in modo tale che ogni volta partivo dal fondo per scrivere. In seguito mi sono accorto in fase di testing che nel file .bin i contatti rimanevano salvati, il problema è che il programma C non li visualizzava. Io scrivevo i primi contatti, in seguito testavo le funzioni cerca, modifica, elimina, ecc. In seguito se provavo a scriverne altri potevo visualizzare solo i contatti nuovi. Per fare un esempio, se inserivo il primo contatto e lo chiamavo Alessandro poi facevo una cerca e inserivo un unleriore contatto chiamandolo Lorenzo io potevo vedere solo il contatto Lorenzo e non più Alessandro, non ostante sul file .bin ci fosse ancora.
Vi ringrazio in anticipo

5 Risposte

  • Re: Trattamento dei file su C

    E senza il codice che hai scritto come si trova l'errore?
  • Re: Trattamento dei file su C

    Definizioni dele funzioni:
    
    #include "file.h"
    
    contatto inizializza(contatto x){
        printf("\nInserisci il nome del contatto: ");
        scanf("%s",x.nome);
        fflush(stdin);
        printf("\nInserisci il cognome del contatto: ");
        scanf("%s",x.cognome);
        fflush(stdin);
        printf("\nInserisci il numero telefonico del contatto: ");
        scanf("%f",&x.telefono);
        fflush(stdin);
        return x;
    }
    
    void stampa (contatto x){
        printf("\n||****************************************");
        printf("\n||Nome: %s", x.nome);
        printf("\n||Cognome: %s", x.cognome);
        printf("\n||Numero: %2.f", x.telefono);
        printf("\n||****************************************");
    }
    
    void scriviSuFile(contatto x, char nomeFile[]){
        FILE *f;
        f=fopen(nomeFile,"a");
        fwrite(&x, sizeof( contatto), 1, f) ;
        fclose(f);
    }
    
    contatto leggiDaFile(contatto x, char nomeFile[]){
        FILE *f;
        f=fopen(nomeFile,"r");
        fread(&x, sizeof( contatto), 1, f);
        fclose(f);
        return x;
    }
    
    int contaContatti(char nomeFile[]){
        int size;
        FILE *f;
        f=fopen(nomeFile,"r");
        fseek(f,0,SEEK_END);
        size=ftell(f);
        fclose(f);
        return size;
    }
    
    contatto sceldaDellaRicerca (char nomeFile[]){
        FILE *f;
        contatto test, x;
        int menu, find;
        f=fopen(nomeFile,"r");
        printf("\n1. Nome");
        printf("\n2. Cognome");
        printf("\n3. Numero telefonico");
        printf("\nQualsiasi altro valore per non eseguire la ricerca");
        printf("\nEseguire ricerca per: ");
        scanf("%d", &menu);
        switch(menu){
            case 1:
                printf("\nInserisci il nome da cercare: ");
                scanf("%s",x.nome);
                while(find=fread(&test, sizeof( contatto),1,f)&&(strcmp(test.nome,x.nome)!=0));
                if(!find){
                    strcpy(test.nome,"");
                    strcpy(test.cognome,"");
                    test.telefono=0;
                }
                break;
    
            case 2:
                printf("\nInserisci il cognome da cercare: ");
                scanf("%s",x.cognome);
                while(find=fread(&test, sizeof( contatto),1,f)&&(strcmp(test.cognome,x.cognome)!=0));
                if(!find){
                    strcpy(test.nome,"");
                    strcpy(test.cognome,"");
                    test.telefono=0;
                }
                break;
    
            case 3:
                printf("\nInserisci il numero di telefono da cercare: ");
                scanf("%f",&x.telefono);
                while(find=fread(&test, sizeof( contatto),1,f)&&(test.telefono,x.telefono));
                if(!find){
                    strcpy(test.nome,"");
                    strcpy(test.cognome,"");
                    test.telefono=0;
                }
                break;
        }
        fclose(f);
        return test;
    }
    
    int elimina(char nomeFile[],contatto x){
        contatto test;
        FILE *f;
        int find;
        f=fopen(nomeFile,"w+");
        while(find=fread(&test, sizeof( contatto),1,f)&&(strcmp(test.nome,x.nome)!=0));
        if(!find){
            return -1;
        }
        while(fread(&test, sizeof(contatto),1,f)){
            fseek(f,-sizeof( contatto)*2,SEEK_CUR);
            fwrite(&test, sizeof( contatto), 1, f);
        }
        fclose(f);
        return 0;
    }
    
    int modifica(char nomeFile[],contatto x){
        contatto test;
        FILE *f;
        int find;
        f=fopen(nomeFile,"w+");
        while(find=fread(&test, sizeof( contatto),1,f)&&(strcmp(test.nome,x.nome)!=0));
        if(!find){
            return -1;
        }
        x=inizializza(x);
        fseek(f,-sizeof( contatto),SEEK_CUR);
        fwrite(&x, sizeof( contatto), 1, f);
        fclose(f);
        return 0;
    }
    
    Main:
    
    #include "file.h"
    
    int main(){
        int ricalcola/*, menu*/, cont;
        contatto a;
        char nomeFile[NOME];
            printf("\nInserisci il nome del file: ");
            scanf("%s", nomeFile);
            printf("\nQuanti contatti vuoi inserire?");
            scanf("%d",&cont);
            for(int i=0;i<cont;i++){
                a=inizializza(a);
                scriviSuFile(a,nomeFile);
            }
    
            do{
            //a=leggiDaFile(a,nomeFile);
            //stampa(a);
            a=sceldaDellaRicerca(nomeFile);
            stampa(a);
            if(a.telefono==0.0)
                printf("\nNon c'è");
            else
                printf("\nc'è");
            printf("\nPer ricalcolare digita 1: ");
            scanf("%d", &ricalcola);
        }while(ricalcola);
        return 0;
    }
    
    
  • Re: Trattamento dei file su C

    oregon ha scritto:


    E senza il codice che hai scritto come si trova l'errore?
    codice inviato, so che il main non è il massimo ma lo sto usando per testare le varie funzioni. Quando andrà tutto farò un menù a modo. Le uniche funzioni che ho testato sono quelle scritte nel main le altre nono so se funzionano, per adesso mi basta solo capire dove sbaglio nella scrittura.
  • Re: Trattamento dei file su C

    Se usi file binari devi aprirli in modo "ab" e "rb"
  • Re: Trattamento dei file su C

    oregon ha scritto:


    Se usi file binari devi aprirli in modo "ab" e "rb"
    Mi sono accorto solo ora che il problema non è nella scrittura e lettura... Il problema è la funzione cerca, avevo dato per scontato che fosse corretta perchè è stata la prof stessa a darcela in quel modo e in un programma di dimostrazione funzionava pure. L'ho riguardata e riguardata più volte e a livello teorico dovrebbe funzionare.
Devi accedere o registrarti per scrivere nel forum
5 risposte