Lettura date da file con struct

di il
23 risposte

Lettura date da file con struct

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

  • Re: Lettura date da file con struct

    Vuoi dire questo ?


    cout << v.nascita.giorno << "\\" << v.nascita.mese << "\\" << v.nascita.anno;
  • Re: Lettura date da file con struct

    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;
  • Re: Lettura date da file con struct

    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;
  • Re: Lettura date da file con struct

    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.
  • Re: Lettura date da file con struct

    Ma tu hai provato o stai facendo un discorso in teoria?
  • Re: Lettura date da file con struct

    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
  • Re: Lettura date da file con struct

    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.
  • Re: Lettura date da file con struct

    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.
  • Re: Lettura date da file con struct

    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.
  • Re: Lettura date da file con struct

    
    #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
  • Re: Lettura date da file con struct

    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.
  • Re: Lettura date da file con struct

    Oddio...a me non va..
  • Re: Lettura date da file con struct

    Ambiente/compilatore? Cosa non va?

    P.S. Nel sorgente manca un

    #include <string>
  • Re: Lettura date da file con struct

    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