Gestione file

di il
20 risposte

Gestione file

Salve a tutti... premetto che è la prima volta che visito questo sito di conseguenza non so se scrivo nello spazio adeguato. Vorrei sapere se c'è qualcuno disposto a darmi una mano nell'eseguire un programma in "C". In particolare si tratta di gestire un file e di conseguenza modificarlo, cancellarlo e visualizzare i vari record. Ringrazio chiunque riesca a darmi una mano.

20 Risposte

  • Re: Gestione file

    Vuoi aiuto nell' "eseguire" o nel "realizzare" ?

    E la domanda qual è ?
  • Re: Gestione file

    Allora nel realizzare.... posso copiare il programma se serve ... non so davvero da che parte girarmi...
  • Re: Gestione file

    Al momento uso code blocks e questo è tutto il programma. Di fatto però la modifica, la cancellazione, la stampa singolo record non funzionano.

    #include <stdio.h>
    #include <stdlib.h>

    struct Data
    {
    int gg;
    int mm;
    int aaaa;
    };

    struct Anagrafica
    {
    char nome[30];
    char cognome[30];
    char matricola[6];
    struct Data Data_Nascita;
    int cancellato;
    };

    struct Anagrafica Nuovo;

    void Inserisci (void)
    {
    FILE *f_input;
    if((f_input=fopen("dati.txt","a"))==NULL){
    printf("Error inexistent file");
    exit(1);
    }else
    {
    printf("Inserisci nome: \n");
    scanf("%s",Nuovo.nome);
    printf("Iserisci cognome:\n");
    scanf("%s",Nuovo.cognome);
    printf("Iserisci matricola:\n");
    scanf("%s",Nuovo.matricola);
    printf("Iserisci data di nascita:\n");
    scanf("%d %d %d",&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa);
    fprintf(f_input,"%s %s %s %d %d %d \n",Nuovo.nome,Nuovo.cognome,Nuovo.matricola,Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);
    }
    fclose(f_input);


    return;
    };

    void Cancella (void)

    {char matricola_richiesta[6];
    int trovato = 0;
    FILE *f_input;

    if ((f_input=fopen("dati.txt","r+"))==NULL){
    printf("Impossibile aprire il file\n");
    exit(1);
    }else {
    printf("\Inserire la matricola da cancellare: ");
    scanf("%s", matricola_richiesta);
    while ((!trovato) && (!feof(f_input))){
    fread(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
    if (!strcmp(Nuovo.matricola, matricola_richiesta)==0) {
    trovato = 1;
    Nuovo.cancellato=1;
    fseek(f_input,-48,SEEK_CUR);
    fwrite(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
    printf("\nCancellazione effettuata!\n");
    }
    }
    fclose(f_input);
    if (!trovato)
    printf("\n La matricola cercata non esiste!\n");

    }
    return;
    };



    void Modifica (void)

    {char matricola_richiesta[6];
    int trovato = 0;
    FILE *f_input;

    if ((f_input=fopen("dati.txt","r+"))==NULL){
    printf("Impossibile aprire il file\n");
    exit(1);
    }else {
    printf("\Inserire la matricola da modificare: ");
    scanf("%s", matricola_richiesta);
    while ((!trovato) && (!feof(f_input))){
    fread(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
    if (!strcmp(Nuovo.matricola, matricola_richiesta)==0) {
    trovato = 1;
    printf("inserisci la nuova matricola (5 valori alfanumerici)\n");
    scanf("%s",Nuovo.matricola);
    printf("inserisci il nuovo nome\n");
    scanf("%s",Nuovo.nome);
    printf("inserisci il nuovo cognome\n");
    scanf("%s",Nuovo.cognome);
    printf("inserisci la nuova data di nascita \n");
    scanf("%d %d %d",&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa);

    fprintf(f_input, " %s %s %s %d %d %d \n", Nuovo.matricola, Nuovo.nome, Nuovo.cognome, Nuovo.Data_Nascita.gg, Nuovo.Data_Nascita.mm, Nuovo.Data_Nascita.aaaa);

    }

    }
    }
    fclose(f_input);
    return;
    }



























    void Stampa_Singolo_Record (void)
    {FILE *f_output;
    char matricola_richiesta[6];
    int trovato = 0;

    if((f_output=fopen("dati.txt","r"))==NULL)
    {
    printf("\nFile non esistente\n");
    exit(1);
    }else {printf("\nInserire la matricola da ricercare\n");
    scanf("%s",&matricola_richiesta);
    while ((!trovato)&&(!feof(f_output))) {fread(&Nuovo,sizeof(struct Anagrafica),0,f_output);
    if (!strcmp(Nuovo.matricola,matricola_richiesta)==0) {

    trovato=1;
    printf("Matricola:%s\n",Nuovo.matricola);
    printf("Nome:%s\n",Nuovo.nome);
    printf("Cognome:%s\n",Nuovo.cognome);
    printf("Data di nascita: %d /%d /%d \n",Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);
    }
    }
    fclose(f_output);
    if(!trovato)
    printf("La matricola cercata non esiste\n");
    }
    return;
    };








    void Stampa_Totale (void)
    {
    FILE *f_output;
    if((f_output=fopen("dati.txt","r"))==NULL){
    printf("Error inexistent file");
    exit(1);
    }else
    {


    while(fscanf(f_output,"%s %s %s %d %d %d \n",&Nuovo.nome,&Nuovo.cognome,&Nuovo.matricola,&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa) !=EOF)
    {
    printf("Nome: %s\n",&Nuovo.nome);
    printf("Cognome: %s\n",&Nuovo.cognome);
    printf("Matricola: %s\n",&Nuovo.matricola);
    printf("Data di nascita: %d/%d/%d \n",Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);

    }
    fclose(f_output);
    }

    {
    {

    }
    }


    return;
    };




    /* Procedura Menu */
    void Menu (void){
    /* variabili locali */
    int Scelta;

    /* istruzioni */
    printf("Gestione dei file\n\n");
    printf("1. Inserisci nuovo record\n");
    printf("2. Cancella Record\n");
    printf("3. Modifica di un record\n");
    printf("4. Stampa singolo Record\n");
    printf("5. Stampa tutti i Record\n");
    printf("0. Uscita\n");

    do{
    printf("Inserire una scelta: ");
    scanf("%d",&Scelta);
    switch (Scelta){ /* Test multiplo */
    case 0: break;
    case 1: Inserisci();
    break;
    case 2: Cancella();
    break;
    case 3: Modifica();
    break;
    case 4: Stampa_Singolo_Record();
    break;
    case 5: Stampa_Totale();
    break;
    default: printf("Inserire una scelta valida\n");
    }

    }while(Scelta != 0);


    return;
    }













    int main()
    {
    Menu();
    }
  • Re: Gestione file

    Ciao, per favore modifica il messaggio e inserisci il codice negli appositi tag CODE. Altrimenti risulta abbastanza illeggibile...
  • Re: Gestione file

    E leggi il regolamento che l'hai infranto almeno 2 volte.
  • Re: Gestione file

    skynet ha scritto:


    E leggi il regolamento che l'hai infranto almeno 2 volte.
    Giusto, se non vuoi rischiare guai ...
    No, seriamente , per ora noto che ti sei dimenticato di includere la libreria string.h e quindi dovrebbe darti errore da parecchie parti perché hai usato la funzione strcmp.
    Poi, secondo me quando scrivi:
    while ((!trovato)&&(!feof(f_output))) {fread(&Nuovo,sizeof(struct Anagrafica),0,f_output);
    if (!strcmp(Nuovo.matricola,matricola_richiesta)==0) {
    quel ! non ci sta bene perché o scrivi (!strcmp(Nuovo.matricola,matricola_richiesta)) o scrivi (strcmp(Nuovo.matricola,matricola_richiesta)==0), se no fa il contrario di quello che vuoi.
    Però, ti anticipo che non è l'unica cosa perché la funzione Stampa_Singolo_Record va solo se i dati sono inseriti nella stessa sessione, quindi non li ricerca tra tutti i dati inseriti.
  • Re: Gestione file

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct Data
    {
        int gg;
        int mm;
        int aaaa;
    };
    
    struct Anagrafica
    {
        char nome[30];
        char cognome[30];
        char matricola[6];
        struct Data Data_Nascita;
        int cancellato;
    };
    
    struct Anagrafica Nuovo;
    
    void Inserisci (void)
    {
        FILE *f_input;
        if((f_input=fopen("dati.txt","a"))==NULL){
        printf("Error inexistent file");
        exit(1);
        }else
        {
        printf("Inserisci nome: \n");
        scanf("%s",Nuovo.nome);
        printf("Iserisci cognome:\n");
        scanf("%s",Nuovo.cognome);
        printf("Iserisci matricola:\n");
        scanf("%s",Nuovo.matricola);
        printf("Iserisci data di nascita:\n");
        scanf("%d %d %d",&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa);
        fprintf(f_input,"%s %s %s %d %d %d \n",Nuovo.nome,Nuovo.cognome,Nuovo.matricola,Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);
        }
    fclose(f_input);
    
    
       return;
    };
    
    void Cancella (void)
    
       {char matricola_richiesta[6];
       int trovato = 0;
       FILE *f_input;
    
     if ((f_input=fopen("dati.txt","r+"))==NULL){
     printf("Impossibile aprire il file\n");
     exit(1);
     }else {
            printf("\Inserire la matricola da cancellare: ");
            scanf("%s", matricola_richiesta);
            while ((!trovato) && (!feof(f_input))){
                                                    fread(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
                                                    if (!strcmp(Nuovo.matricola, matricola_richiesta)==0) {
                                                                                                        trovato = 1;
                                                                                                        Nuovo.cancellato=1;
                                                                                                        fseek(f_input,-48,SEEK_CUR);
                                                                                                fwrite(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
                                                                                                printf("\nCancellazione effettuata!\n");
                                                                                                        }
                                                    }
            fclose(f_input);
            if (!trovato)
            printf("\n La matricola cercata non esiste!\n");
    
            }
    return;
       };
    
    
    
    void Modifica (void)
    
       {char matricola_richiesta[6];
       int trovato = 0;
       FILE *f_input;
    
     if ((f_input=fopen("dati.txt","r+"))==NULL){
     printf("Impossibile aprire il file\n");
     exit(1);
     }else {
            printf("\Inserire la matricola da modificare: ");
            scanf("%s", matricola_richiesta);
           while ((!trovato) && (!feof(f_input))){
                                                  fread(&Nuovo, sizeof(struct Anagrafica), 1, f_input);
                                                  if (!strcmp(Nuovo.matricola, matricola_richiesta)==0) {
                                                                                                       trovato = 1;
                                                    printf("inserisci la nuova matricola (5 valori alfanumerici)\n");
                                                    scanf("%s",Nuovo.matricola);
                                                    printf("inserisci il nuovo nome\n");
                                                    scanf("%s",Nuovo.nome);
                                                    printf("inserisci il nuovo cognome\n");
                                                    scanf("%s",Nuovo.cognome);
                                                    printf("inserisci la nuova data di nascita \n");
                                                    scanf("%d %d %d",&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa);
    
         fprintf(f_input, " %s %s %s %d %d %d \n", Nuovo.matricola, Nuovo.nome, Nuovo.cognome, Nuovo.Data_Nascita.gg, Nuovo.Data_Nascita.mm, Nuovo.Data_Nascita.aaaa);
    
                                                  }
    
              }
         }
     fclose(f_input);
            return;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    void Stampa_Singolo_Record (void)
    {FILE *f_output;
     char matricola_richiesta[6];
     int trovato = 0;
    
     if((f_output=fopen("dati.txt","r"))==NULL)
     {
         printf("\nFile non esistente\n");
         exit(1);
     }else  {printf("\nInserire la matricola da ricercare\n");
            scanf("%s",&matricola_richiesta);
             while ((!trovato)&&(!feof(f_output)))   {fread(&Nuovo,sizeof(struct Anagrafica),0,f_output);
                                                        if (strcmp(Nuovo.matricola,matricola_richiesta)==0) {
    
                                                                                                                trovato=1;
                                                                                                                printf("Matricola:%s\n",Nuovo.matricola);
                                                                                                                 printf("Nome:%s\n",Nuovo.nome);
                                                                                                                 printf("Cognome:%s\n",Nuovo.cognome);
                                                                                                                 printf("Data di nascita: %d /%d /%d \n",Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);
                                                                                                             }
                                                     }
            fclose(f_output);
            if(!trovato)
            printf("La matricola cercata non esiste\n");
            }
            return;
    };
    
    
    
    
    
    
    
    
    void Stampa_Totale (void)
    {
        FILE *f_output;
        if((f_output=fopen("dati.txt","r"))==NULL){
        printf("Error inexistent file");
        exit(1);
        }else
    {
    
    
        while(fscanf(f_output,"%s %s %s %d %d %d \n",&Nuovo.nome,&Nuovo.cognome,&Nuovo.matricola,&Nuovo.Data_Nascita.gg,&Nuovo.Data_Nascita.mm,&Nuovo.Data_Nascita.aaaa) !=EOF)
    {
        printf("Nome: %s\n",&Nuovo.nome);
        printf("Cognome: %s\n",&Nuovo.cognome);
        printf("Matricola: %s\n",&Nuovo.matricola);
        printf("Data di nascita: %d/%d/%d  \n",Nuovo.Data_Nascita.gg,Nuovo.Data_Nascita.mm,Nuovo.Data_Nascita.aaaa);
    
    }
    fclose(f_output);
        }
    
    {
        {
    
        }
    }
    
    
        return;
    };
    
    
    
    
    /* Procedura Menu */
    void Menu (void){
        /* variabili locali */
        int Scelta;
    
        /* istruzioni */
        printf("Gestione dei file\n\n");
        printf("1. Inserisci nuovo record\n");
        printf("2. Cancella Record\n");
        printf("3. Modifica di un record\n");
        printf("4. Stampa singolo Record\n");
        printf("5. Stampa tutti i Record\n");
        printf("0. Uscita\n");
    
        do{
           printf("Inserire una scelta: ");
           scanf("%d",&Scelta);
           switch (Scelta){ /* Test multiplo */
                case 0: break;
                case 1: Inserisci();
                        break;
                case 2: Cancella();
                        break;
                case 3: Modifica();
                        break;
                case 4: Stampa_Singolo_Record();
                        break;
                case 5: Stampa_Totale();
                        break;
                default: printf("Inserire una scelta valida\n");
           }
    
        }while(Scelta != 0);
    
    
        return;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    int main()
    {
       Menu();
    }
    

    Spero di aver fatto correttamente... comunque grazie per il suggerimento.Se però dovessi fare in modo che la stampa singola vada in più sessioni come potrei fare?
  • Re: Gestione file

    Prego chiunque abbia un po' di pazienza di darmi una mano. Davvero non capisco cosa fare.
  • Re: Gestione file

    Scusa, ho visto solo ora il tuo messaggio ma è meglio discutere qui, nell'argomento, e non per messaggi privati per permettere a tutti di dare risposte (anche migliori delle mie) alle tue domande .
    Per far ricercare in tutte le sessioni(in modo che adottare un file abbia senso), devi scorrere i vari record in modo lineare o binario. Cioè, devi leggere tutti i dati uno per volta, compararlo e decidere oppure usare la ricerca binaria, che è tempisticamente migliore(ma dato che mi sembra tu non debba utilizzare una grande mole di dati puoi usare quella semplice). Il tuo errore è che leggi solo l'ultimo dato inserito e non tutti i dati, ti faccio un esempio su interi:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void controllo_file(FILE *fp){
         
         if(!fp){
                 
                 printf("Il file non si apre\n");
                 system("pause");
                 exit(1);
                 }
    }
    
    int main(){
        
        FILE *a;
        
        a = fopen("dati.txt","r+");
        controllo_file(a);
        
        int i, j, num;
        
        printf("Scrivere(0)\nRicercare(1)\nScelta: ");
        scanf("%d", &i);
        
        if(!i){
               
               fseek(a,0,SEEK_END);            //Porto il cursore alla fine, non sempre è necessario
               
               printf("\n\nQuanti numeri vuoi inserire ");
               scanf("%d", &j);
    
               for(i = 0; i < j; i++){
    
                     printf("\nNumero: ");
                     scanf("%d", &num);
               
               fprintf(a,"%d\n", num);
               }
               }
    
        else{
    
              rewind(a);                      //Porto il cursore all'inizio
    
              printf("Numero da cercare ");
              scanf("%d", &num);
              
              while(feof(a) == 0){
                            
                            fscanf(a,"%d",&j);            //La funzione fscanf mi sposta il cursore in avanti
                            
                            if(num == j)
                            printf("\nTrovato:%d", j);
                            
                            printf("\n%d\n", ftell(a));  //Stampa le posizione del cursore a titolo indicativo
                            }
              }
              
              system("pause");
    }
  • Re: Gestione file

    Scusa.... Ma purtroppo non capisco molto sono appena entrato nel mondo del C... Come dovrei fare ?
  • Re: Gestione file

    Per essere chiari, da regolamento (e per correttezza) non ti si può fornire il "codice pronto".

    Quindi, dicci cosa non comprendi e sforzati di partecipare al discorso, altrimenti non riuscirai a risolvere.
  • Re: Gestione file

    dinoinfo ha scritto:


    Scusa.... Ma purtroppo non capisco molto sono appena entrato nel mondo del C... Come dovrei fare ?
    Hai un libro di testo?
    Se si, prova a studiare la parte inerente alla ricerca, c'è in ogni libro.
    Se non ce l'hai , devi comprarlo.
    Forse devi rivedere anche l'uso della fread, comunque ti ripeto che il tuo errore non è di grammatica ma di sintassi, non fai una ricerca perché non compari tutti i dati inseriti, devi scorrerli uno ad uno, leggerli, spostare il cursore ecc...

    oregon ha scritto:


    Per essere chiari, da regolamento (e per correttezza) non ti si può fornire il "codice pronto".

    Quindi, dicci cosa non comprendi e sforzati di partecipare al discorso, altrimenti non riuscirai a risolvere.
    Giusto, fai una bella domanda, completa, esprimi un tuo dubbio generale, non specifico di un solo problema, intanto, che basi hai? Stai svolgendo un esercizio?...
  • Re: Gestione file

    Allora mi trovo in questa situazione... devo fare un programma per la scuola. Il fatto è che il professore non da grandi spiegazioni e io sono in alto mare. Cerchiamo tutti di arrangiarci ma niente... programmazione è impossibile. Voglio capirla ma non ci riesco. Ora parlando del programma... ho questi problemi: la modifica non va, la cancellazione dice nella sessione che avviene quando poi invece guardo con il comando "Stampa tutti i record" trovo lo stesso quel file, ultimo ho notato come già detto da Platone 2.0 che la Stampa singola va nella prima sessione e basta. Cercherei di risolvere i miei dubbi ma non so davvero come fare, su internet non capisco ed è difficilissimo trovare quello che si cerca.
  • Re: Gestione file

    Ascolta, partiamo dalla funzione cancella, qual è stato il tuo ragionamento per arrivare al codice?
    Per esempio, perché fai tornare il cursore indietro proprio di -48?
    Dove lo ricavi questo dato?
    Forse, intendevi ritornare indietro perché dopo la lettura la testina si troverà alla fine del record e volevi riportarla all'inizio? Ma allora, perché -48? Il numero giusto non è quello..
    Come lo calcoliamo?
    (Da ora in avanti correggetemi se sbaglio perché non sono proprio sicuro sulle dimensioni, comunque per scoprirle puoi usare la sizeof())

    Un int di solito è 4 byte, un char 1 byte.

    Quindi: 30+30+6+12+4 = 82
    Il 48 dove l'hai trovato?
Devi accedere o registrarti per scrivere nel forum
20 risposte