Lettura date da file con struct

di Anonimizzato13084 il
23 risposte
Salve ragazzi,scusate se sto abusando della vostra pazienza,ma avrei un altro problemino xD..:
Scrivere un programma in C++ che sia in grado di leggere da un file, dal nome candidati.txt, una lista di candidati. Le informazioni sono così strutturate una per ogni riga.
Id_candidato (riga i-esima)
Nome (riga i+1-esima)
Cognome (riga i+2-esima)
Data_di_nascita (riga i+3-esima)
Sesso (riga i+4-esima)
Voti (riga i+5-esima)
E così via.
Organizzare il programma con un main con chiamate a funzione per:
1) Caricare e visualizzare a video la lista dei candidati presenti nel file candidati.txt;
2) Scrivere, in un file candidati_maschi.txt, i candidati maschi nati dopo il 1970 ed in un file candidati_femmine.txt con i candidati femmine nate prima il 1990.
Per il primo punto tutto bene...(utilizzando per le date una variabile string):

int const Max_candidati=50;
struct data
{
  int giorno, mese, anno;
};
struct persona
{   int Id_candidato;
    string nome;
    string cognome;
    struct data nascita;
    char sesso;
    int voto;

};


void LeggiStruct(char NomeFile[],struct persona v[],int &n_candidati)
{n_candidati=0;
    ifstream leggi;
    leggi.open(NomeFile);
    while(!leggi.eof())
    {
        leggi >>v[n_candidati].Id_candidato;
        leggi >>v[n_candidati].nome;
        leggi >>v[n_candidati].cognome;
        leggi >>v[n_candidati].nascita.giorno;
        leggi >>v[n_candidati].nascita.mese;
        leggi >>v[n_candidati].nascita.anno;
        leggi >>v[n_candidati].sesso;
        leggi >>v[n_candidati].voto;
        n_candidati++;
    }
leggi.close();

}

void StampaStruct(struct persona v[],int n_candidati)
{for(int i=0;i<n_candidati;i++)
{
       cout<<v[i].Id_candidato<<endl;
        cout<<v[i].nome<<endl;
        cout<<v[i].cognome<<endl;
        cout<<v[i].nascita.giorno;
        cout<<v[i].nascita.mese;
        cout<<v[i].nascita.anno;
        cout<<v[i].sesso<<endl;
        cout<<v[i].voto<<endl;
        cout<<endl;
}

}
Letto il secondo punto,mi sono reso conto che non andava bene una variabile string per contenere le date,visto che dovevo confrontare gli anni di nascita.Allora ho usato una struct data che mi avrebbe permesso facilmente di confrontare gli anni...il problema è che le date sul file sono scritte gg/mm/aaaa e non riesco a capire come fare per stampare quello slash e allo stesso tempo mantenere la variabile int :S

23 Risposte

  • Vuoi dire questo ?


    cout << v.nascita.giorno << "\\" << v.nascita.mese << "\\" << v.nascita.anno;
  • Nono xD
    Intendo che quando leggo da file c'è già lo slash,quindi quando lo do "in pasto" ad una variabile int ho un errore
    Dovrei correggere questa parte di codice:
    leggi >>v[n_candidati].nascita.giorno;
    leggi >>v[n_candidati].nascita.mese;
    leggi >>v[n_candidati].nascita.anno;
  • Nick1992 ha scritto:


    Nono xD
    Hai scritto :
    non riesco a capire come fare per stampare quello slash ...
    ... era quello che si capiva ...
    Intendo che ...
    Dichiari una variabile char e scrivi
    
    
    char dummy;
    
    leggi >>v[n_candidati].nascita.giorno;
    leggi >> dummy;
    leggi >>v[n_candidati].nascita.mese;
    leggi >> dummy;
    leggi >>v[n_candidati].nascita.anno;
  • Scusa ma così comunque non va bene,perchè il modo con cui è scritta la data nel file di testo,come ho detto sopra,è gg/mm/aaaa e non prevede spazi,quindi anche inserendo una variabile char ausiliaria tutta la data va a finire nel primo int,ed essendoci caratteri(come appunto lo slash)non leggibili da un intero,non viene stampato nulla.
  • Ma tu hai provato o stai facendo un discorso in teoria?
  • Provato provato.Ho compilato mantenendo il formato standard del file e non andava,solo modificandolo(cosa che non potrei fare),aggiungendo lo spazio tra il numero e lo slash,andava
  • No, guarda che funziona anche senza spazi, non so come hai provato ma funziona perché il carattere / interrompe la lettura dell'intero come se fosse uno spazio.

    La lettura avviene correttamente, se hai problemi stanno da un'altra parte.
  • Ma scusa,se lo "/" interrompe la lettura,allora non avrei dovuto aver problemi neanche prima,l'unica cosa sarebbe stata che avrei ottenuto una stampa del tipo 29081992.Non mi sembra ci siano errori nel codice,anche perchè quando utilizzavo la variabile string per le date andava tutto bene.
  • Nick1992 ha scritto:


    Ma scusa,se lo "/" interrompe la lettura,allora non avrei dovuto aver problemi neanche prima
    Non è così, avresti letto correttamente il primo valore (giorno) ma non gli altri.

    Posta il codice completo che usi e lo provo.
  • 
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    int const Max_candidati=50;
    struct data
    {
      int giorno, mese, anno;
    };
    struct persona
    {   int Id_candidato;
        string nome;
        string cognome;
        struct data nascita;
        char sesso;
        int voto;
    
    };
    
    
    void LeggiStruct(char NomeFile[],struct persona v[],int &n_candidati)
    {n_candidati=0;
        ifstream leggi;
        leggi.open(NomeFile);
        while(!leggi.eof())
        {
            
            leggi >>v[n_candidati].Id_candidato;
            leggi >>v[n_candidati].nome;
            leggi >>v[n_candidati].cognome;
            leggi >>v[n_candidati].nascita.giorno;
            leggi >>v[n_candidati].nascita.mese;
            leggi >>v[n_candidati].nascita.anno;
            leggi >>v[n_candidati].sesso;
            leggi >>v[n_candidati].voto;
            n_candidati++;
        }
    leggi.close();
    
    }
    
    void StampaStruct(struct persona v[],int n_candidati)
    {for(int i=0;i<n_candidati;i++)
    {
           cout<<v[i].Id_candidato<<endl;
            cout<<v[i].nome<<endl;
            cout<<v[i].cognome<<endl;
            cout<<v[i].nascita.giorno;
            cout<<v[i].nascita.mese;
            cout<<v[i].nascita.anno<<endl;
            cout<<v[i].sesso<<endl;
            cout<<v[i].voto<<endl;
            cout<<endl;
    }
    
    }
    
    
    int main()
    {int n_Candidati;
    persona candidato[Max_candidati];
    
        LeggiStruct("C:\\Users\\Vittorio\\Desktop\\Lista.txt",candidato,n_Candidati);
        StampaStruct(candidato,n_Candidati);
    
    
        return 0;
    }
    
    E questo è il file di testo:
    1
    Aldo
    Esposito
    12/01/1994
    M
    30
    2
    Carlo
    Rossi
    01/03/1958
    M
    50
    3
    Annamaria
    Verde
    12/12/1962
    F
    100
    4
    Rosa
    Manna
    23/01/1993
    F
    1400
  • Come ti dicevo, così non funziona ma se aggiungi nella LeggiStruct
    
    char dummy;
    
    leggi >>v[n_candidati].nascita.giorno  >> dummy;
    leggi >>v[n_candidati].nascita.mese  >> dummy;
    
    e ovviamente nella StampaStruct scrivi
    
    cout<<v[i].nascita.giorno << "/";
    cout<<v[i].nascita.mese << "/";
    
    va tutto bene.
  • Oddio...a me non va..
  • Ambiente/compilatore? Cosa non va?

    P.S. Nel sorgente manca un

    #include <string>
  • Sto usando Code blocks ver 13.12.Quando compilo continua ad uscire la finestra vuota..
    (Cmq c'è string)
Devi accedere o registrarti per scrivere nel forum
23 risposte