Salvare i dati

di
Anonimizzato6917
il
18 risposte

Salvare i dati

Dilettandomi col C ho deciso di iniziare a sviluppare un semplice programma (diciamo più una utility personale), la quale ponga una lista di materie scolastiche e tramite una scelta dal menu principale chieda all'utente,dopo aver scelto successivamente in un altro switch fra "scritto,orale e pratico", se inserire un nuovo voto,o visualizzare la situazione attuale. Fin qua nessun problema. Altro switch fra le due selezioni.

Nel caso la scelta sia "1" viene chiesto di inserire un nuovo voto,e una volta letto esce dal programma.

Nel caso la scelta sia "2" apparirà una schermata che mostra la media complessiva dei voti in quella materia.

Di seguito il listato (solo dalla scelta del menu in poi,il resto l'ho omesso poiché conteneva solo una serie printf che mostravano le varie opzioni di scelta. Ho giusto inserito le variabili globali.) :

Variabili globali
__________________________
 
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
FILE *F1;
int scelta_menu;
int scelta_1,scelta_11;
float voto,media,n;
 
_____________________________________________-
 
Programma principale
 
     printf("Premere un tasto a scelta da 1 a 10 per scegliere la materia:  ");
     scanf("%d",&scelta_menu);
     switch (scelta_menu)
     {   
         case 1: system ("cls");
                 printf("\n");
                 printf("1. Scritto.");
                 printf("\n");
                 printf("2. Orale.");
                 printf("\n");
                 printf("3. Pratico.");
                 printf("\n");
                 printf("\n");
                 printf("Inserire 1,2 o 3 per scegliere:  ");
                 scanf("%d",&scelta_1);
                 switch(scelta_1)
                 {
                                 case 1: system("cls");
                                         printf("\n");
                                         printf("1. Inserisci nuovo voto.");
                                         printf("\n");
                                         printf("2. Visualizza situazione.");
                                         printf("\n");
                                         printf("\n");
                                         printf("Digitare 1 o 2 per scegliere:  ");
                                         scanf("%d",&scelta_11);
                                         switch (scelta_11)
                                         {
                                                 case 1: do
                                                         {
                                                         system("cls");
                                                         printf("\n");
                                                         fopen("voto.txt","w+");
                                                              if((F1 = fopen("voto.txt","w+")) == NULL)
                                                              {
                                                                     printf("Errore nell'apertura del file\n");
                                                                     exit(1);
                                                              }
                                                         printf("Inserisci un nuovo voto:  ");
                                                         scanf("%f",&voto);
                                                         }while ((voto <= 0) || (voto >= 10));
                                                         fclose(F1);
                                                         printf("\n");
 
                                              case 2: system("cls");
                                                         fopen("voto.txt","r");
                                                         printf("\n");
                                                         printf("Situazione:  ");
                                                         printf("\n");
                                                         printf("\n");
                                                         printf("\n");
                                                         printf("\n");
                                                         printf("La media complessiva dei voti e': %2.2f",&voto);
                                                         fclose(F1);
                                                         printf("\n");
                                                         printf("\n");
                                         }
                 }
     }
     system("PAUSE");         
}
Il problema appunto è: Come faccio a salvare i voti che inserisco in un file di testo e riutilizzarli anche dopo la chiusura del programma per fare la media complessiva dei voti?

Sono a conoscenza dei File,ma ammetto che non c'ho capito veramente niente. Ho letto pure la guida sul forum,ma nisba..
Sul programma ho abbozzato qualcosa. Non fate caso se il codice può risultare poco ordinato quindi.

Qualcuno sa dirmi niente a riguardo?

18 Risposte

  • Re: Salvare i dati

    Ciao,
    puoi utilizzare 2 modi per leggere e scrivere su file. Il primo è utilizzando le funzioni fwrite / fread, mentre il secondo utilizzando fprintf / fscanf.
    
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    
    ptr: puntatore ai dati che vuoi scrivere sul file;
    size: dimensione in byte del tipo di dato che vuoi salvare;
    nmemb: numero di elementi del buffer;
    stream: puntatore alla struttura file (quella che hai usato nella fopen).

    La funzione fread è uguale. L'unica cosa che cambia è che restituirà in ptr i dati che vuoi leggere.
    
    int fprintf(FILE *stream, const char *format, ...);
    
    è come usare una printf, con l'unica aggiunta del puntatore a FILE stream, che ti permette di scrivere non sul terminale, ma proprio sul tuo file. Stesso discorso per la fscanf.

    Se vuoi un consiglio, per semplicità, io userei proprio fprintf e fscanf. Quindi, se vuoi salvare un numero (il voto) scriverai:
    
    fprintf(file, "%d\n", voto);
    
    Se vuoi leggere tutti i voti di un file:
    
    do{
       ret = fscanf(file, "%d\n", &voto);
       if (ret != EOF){
          media += voto;
          num += 1;
       }
    }while (ret != EOF);
    media /= num;
    
  • Re: Salvare i dati

    TI ringrazio.
    Adesso il file di testo me lo crea sul desktop.

    Ho provato però ad inserire un voto nel programma e a visualizzare,una volta chiuso l'applicazione,la situazione dei voti. Resta sempre 0.
    Cosi come se vai ad aprire il file di testo,vedi un unico numero,appunto 0.

    Dov'è lo sbaglio?
    printf("\n");
         fopen("voto.txt","r+");
         if((F1 = fopen("voto.txt","w+")) == NULL)
         {
           printf("Errore nell'apertura del file\n");
           exit(1);
         }
         printf("\n");
         printf("Premere un tasto a scelta da 1 a 10 per scegliere la materia:  ");
         scanf("%d",&scelta_menu);
         switch (scelta_menu)
         {   
             case 1: system ("cls");
                     printf("\n");
                     printf("1. Scritto.");
                     printf("\n");
                     printf("2. Orale.");
                     printf("\n");
                     printf("3. Pratico.");
                     printf("\n");
                     printf("\n");
                     printf("Inserire 1,2 o 3 per scegliere:  ");
                     scanf("%d",&scelta_1);
                     switch(scelta_1)
                     {
                                     case 1: system("cls");
                                             printf("\n");
                                             printf("1. Inserisci nuovo voto.");
                                             printf("\n");
                                             printf("2. Visualizza situazione.");
                                             printf("\n");
                                             printf("\n");
                                             printf("Digitare 1 o 2 per scegliere:  ");
                                             scanf("%d",&scelta_11);
                                             switch (scelta_11)
                                             {
                                                     case 1: do
                                                             {
                                                             system("cls");
                                                             printf("\n");
                                                             printf("Inserisci un nuovo voto:  ");
                                                             scanf("%f",&voto);
                                                             }while ((voto <= 0) || (voto >= 10));
                                                             fprintf(F1,"%d\n",voto);
                                                             fclose(F1);
                                                             printf("\n");
                                                             break;
                                                             
                                                     case 2: system("cls");
                                                             do{
                                                             ret = fscanf(F1,"%d\n",&voto);
                                                             if (ret != EOF)
                                                             {
                                                               media += voto;
                                                               num += 1;
                                                             }
                                                             }while (ret != EOF);
                                                             media /= num;
                                                             printf("\n");
                                                             printf("Situazione:  ");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("La media complessiva dei voti e': %2.2f",&media);
                                                             fclose(F1);
                                                             printf("\n");
                                                             printf("\n");
                                                             break;
                                             }
                     }
         }
         system("PAUSE");         
    }
  • Re: Salvare i dati

    L'errore sta nelle prime 2 righe. Infatti, prima apri il file in lettura e poi in scrittura. In lettura neanche gli assegni F1.
    fopen("voto.txt","r+");
    if((F1 = fopen("voto.txt","w+")) == NULL)
    queste due righe le togli e al loro posto metti queste:
    
    F1 = fopen("voto.txt","rw");
    if (F1 == null){
       printf("Errore\n");
       exit(1);
    }
    
  • Re: Salvare i dati

    Ok,direi che ci siamo quasi.
    Adesso nel file di testo mi scrive il voto.

    Inserimento voto: 7

    (Una volta aperto il file di testo) : 7.00000

    C'è un piccolo problema però.
    Ogni volta che chiudo il programma,lo riapro e inserisco un'altro voto,mi sostituisce quello vecchio col nuovo,e la media non viene fatta di conseguenza.

    Come faccio in questo caso?
  • Re: Salvare i dati

    Devi aprire il file in modalita` append, utilizzando la stringa "a". Se, invece usi "a+" specifichi che lo vuoi aprire anche in read.
    F1 = fopen("voto.txt","a+");
  • Re: Salvare i dati

    Perfetto! Adesso scrive tutti i voti inseriti nel file di testo.

    La media però non funziona.
    Non appena seleziono come scelta "Visualizza situazione" il cursore rimane bloccato in cima allo schermo e non succede niente.

    Abbi pazienza intel,sai mica dov'è l'errore anche qua?
    Manca poco..
  • Re: Salvare i dati

    Perche` dopo l'inserimento il cursore e` posizionato alla fine del file. Dovresti aprire e chiudere il file ad ogni inserimento e aprirlo e chiuderlo ad ogni lettura.
    Ti basta spostare l'istruzione di apertura e chiusura del file all'interno del codice.

    Per scrivere un voto:
    
    F1 = fopen(file, "a")
    frpintf(valore)
    close(F1)
    
    Per fare la media:
    
    F1 = fopen(file, "r")
    [esegui media]
    close(F1)
    
  • Re: Salvare i dati

    Posto il listato di nuovo per far vedere come ho fatto,ma cosi la situazione rimane invariata.
    printf("\n");
         printf("\n");
         printf("Premere un tasto a scelta da 1 a 10 per scegliere la materia:  ");
         scanf("%d",&scelta_menu);
         switch (scelta_menu)
         {   
             case 1: system ("cls");
                     printf("\n");
                     printf("1. Scritto.");
                     printf("\n");
                     printf("2. Orale.");
                     printf("\n");
                     printf("3. Pratico.");
                     printf("\n");
                     printf("\n");
                     printf("Inserire 1,2 o 3 per scegliere:  ");
                     scanf("%d",&scelta_1);
                     switch(scelta_1)
                     {
                                     case 1: system("cls");
                                             printf("\n");
                                             printf("1. Inserisci nuovo voto.");
                                             printf("\n");
                                             printf("2. Visualizza situazione.");
                                             printf("\n");
                                             printf("\n");
                                             printf("Digitare 1 o 2 per scegliere:  ");
                                             scanf("%d",&scelta_11);
                                             switch (scelta_11)
                                             {
                                                     case 1: F1 = fopen("voto.txt","a+");
                                                             if (F1 == NULL)
                                                             {
                                                             printf("Errore\n");
                                                             exit(1);
                                                             }
                                                             do
                                                             {
                                                             system("cls");
                                                             printf("\n");
                                                             printf("Inserisci un nuovo voto:  ");
                                                             scanf("%f",&voto);
                                                             }while ((voto <= 0) || (voto >= 10));
                                                             fprintf(F1,"%0.2f\n",voto);
                                                             printf("\n");
                                                             fclose(F1);
                                                             break;
                                                             
                                                     case 2: F1 = fopen("voto.txt","a+");
                                                             if (F1 == NULL)
                                                             {
                                                             printf("Errore\n");
                                                             exit(1);
                                                             }
                                                             system("cls");
                                                             do{
                                                             ret = fscanf(F1, "%2.2f\n", &voto);
                                                             if (ret != EOF){
                                                             media += voto;
                                                             num += 1;
                                                             }
                                                             }while (ret != EOF);
                                                             media /= num;
                                                             printf("\n");
                                                             printf("Situazione:  ");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("La media complessiva dei voti e': %2.2f",&media);
                                                             fclose(F1);
                                                             printf("\n");
                                                             printf("\n");
                                                             break;
                                             }
                     }
         }
         system("PAUSE");         
    }
  • Re: Salvare i dati

    Il codice sembra corretto. 2 sole cose da modificare

    1) nella fprintf e fscanf, devi mettere %d al posto %0.2f e %2.2f.
    2) nel case 2 cambia F1 = fopen("voto.txt","a+"); in F1 = fopen("voto.txt","r");

    Vedi se funziona e fammi sapere.
  • Re: Salvare i dati

    Il fatto è che la variabile voto l'ho dichiarata float,se uso %d come identificatore mi restituisce 0 nel file. Poi non so,per quanto riguarda "media","num" li ho inizializzati a 0,ret l'ho dovuta dichiarare anche essa variabile.
    Variabili:
    _________________________________
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    
    FILE *F1;
    int scelta_menu;
    int scelta_1,scelta_11;
    
    float voto,media=0,num=0,ret;
    
    _________________________________
    
    ...
    
    printf("Premere un tasto a scelta da 1 a 10 per scegliere la materia:  ");
         scanf("%d",&scelta_menu);
         switch (scelta_menu)
         {   
             case 1: system ("cls");
                     printf("\n");
                     printf("1. Scritto.");
                     printf("\n");
                     printf("2. Orale.");
                     printf("\n");
                     printf("3. Pratico.");
                     printf("\n");
                     printf("\n");
                     printf("Inserire 1,2 o 3 per scegliere:  ");
                     scanf("%d",&scelta_1);
                     switch(scelta_1)
                     {
                                     case 1: system("cls");
                                             printf("\n");
                                             printf("1. Inserisci nuovo voto.");
                                             printf("\n");
                                             printf("2. Visualizza situazione.");
                                             printf("\n");
                                             printf("\n");
                                             printf("Digitare 1 o 2 per scegliere:  ");
                                             scanf("%d",&scelta_11);
                                             switch (scelta_11)
                                             {
                                                     case 1: F1 = fopen("voto.txt","a");
                                                             if (F1 == NULL)
                                                             {
                                                             printf("Errore\n");
                                                             exit(1);
                                                             }
                                                             do
                                                             {
                                                             system("cls");
                                                             printf("\n");
                                                             printf("Inserisci un nuovo voto:  ");
                                                             scanf("%f",&voto);
                                                             }while ((voto <= 0) || (voto >= 10));
                                                             fprintf(F1,"%0.2\n",voto);
                                                             printf("\n");
                                                             fclose(F1);
                                                             break;
                                                             
                                                     case 2: F1 = fopen("voto.txt","r");
                                                             if (F1 == NULL)
                                                             {
                                                             printf("Errore\n");
                                                             exit(1);
                                                             }
                                                             system("cls");
                                                             do{
                                                             ret = fscanf(F1, "%0.2f\n", &voto);
                                                             if (ret != EOF){
                                                             media += voto;
                                                             num += 1;
                                                             }
                                                             }while (ret != EOF);
                                                             media /= num;
                                                             printf("\n");
                                                             printf("Situazione:  ");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("\n");
                                                             printf("La media complessiva dei voti e': %2.2f",&media);
                                                             fclose(F1);
                                                             printf("\n");
                                                             printf("\n");
                                                             break;
                                             }
                     }
         }
         system("PAUSE");         
    }
    Per il resto nisba. L'inserimento del voto è correttissimo. Vengono scritti tutti i voti uno sotto l'altro nel file:

    6.00
    7.00
    6.50
    ecc..

    è quando seleziono come scelta 2 che il programma si pianta. La schermata rimane nera,il cursore rimane in cima in alto a sinistra e lampeggia,il vuoto.
  • Re: Salvare i dati

    Perché l'hai dichiarata float?.. un voto è cmq sempre un numero intero!!.. cmq se la vuoi lasciare float ti conviene mettere %f
    Invece la variabile media è giusto che sia float perché può ammettere la virgola e ret deve essere un intero.
    le unicche variabili che devi inizializzare a zero sono media e num. Le altre non c'è bisogno.
    P.s. hai provato a cancellare il file?.. non vorrei che sono rimasti valori vecchi che ti danno errore. Ogni volta che fai la prova cancella sempre il file.
  • Re: Salvare i dati

    Si,il file lo cancello sempre ad ogni prova. Il problema del cursore era dovuto al "%0.2f" che avevo impostato nella fscanf,nel 2° case. Adesso non si pianta ma come media da sempre il risultato 0.00 nonostante salvi sul file tutti i voti.

    Quindi penso che il problema sia qualcosa che non è impostato bene nel ciclo do del 2° case,o qualcosa che è stato inizializzato male.

    Ripeto:
    int ret;
    
    float voto,media=0,num=0,null;
    case 2: F1 = fopen("voto_inf_scr.txt","r");
                       if (F1 == NULL)
                       {
                          printf("Errore\n");
                          exit(1);
                       }
                       system("cls");
                       do{
                             ret = fscanf(F1,"%f\n",&voto);
                            if (ret != EOF){
                                  media += voto;
                                  num += 1;
                                                }
                           }while (ret != EOF);
                       media /= num;
                       printf("\n");
                       printf("Situazione:  ");
                       printf("\n");
                       printf("\n");
                       printf("\n");
                       printf("\n");
                       printf("La media complessiva dei voti e': %0.2f",&media);
                       fclose(F1);
                       printf("\n");
                       printf("\n");
                       break;
  • Re: Salvare i dati

    
    printf("La media complessiva dei voti e': %0.2f",&media);
    
    ~Max~
  • Re: Salvare i dati

    L'errore sta nel fatto che nella printf stampi l'indirizzo della variabile media, e non il valore suo valore.
    printf("La media complessiva dei voti e': %0.2f",&media);
    Se al posto di quell'istruzione scrivi questa che ti posto, dovrebbe funzionare
    
    printf("La media complessiva dei voti e': %f\n",media);
    
Devi accedere o registrarti per scrivere nel forum
18 risposte