Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c++] lettura da file per gestione iscrizioni

    Ho un problema urgente!!! Vi spiego:
    Devo fare un programma per un esame che gestisca delle iscrizioni leggendo il tutto da file...
    Per ora ho fatto questo...
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    struct persona{
    string nome;
    string cognome;
    string data_nascita;
    };
    
    ifstream in;
    persona database[50];
    
    int apri()
    {
    char nome[50];
    char cognome[50];
    char data[10];
    int k = 0;
    
    in.open("persone.txt");
    if(in.fail())
    {
    cout<<"Errore nell'apertura archivio"<<endl;
    }
    else
    {
    while(!in.eof())
    {
    in.get(nome, 50);
    in.get(cognome, 50);
    in.get(data, 50);
    database[k].nome = nome;
    database[k].cognome = cognome;
    database[k].data_nascita = data;
    k++;
    }
    }
    in.close();
    return k;
    }
    
    int main()
    {
    int n_persone;
    n_persone = apri();
    for(int i = 0; i < n_persone i++)
    {
    cout<<"Nome: "<<database[i].nome<<endl;
    cout<<"Cognome: "<<database[i].cognome<<endl;
    cout<<"Data di Nascita: "<<database[i].data_nascita<<endl;
    return 0;
    }
    il mio file persone.txt è strutturato così:
    Nome1
    Cognome1
    Data1
    Nome2
    Cognome2
    Data2
    ...

    Il problema è che quando lancio il programma mi viene dato un errore di Segmentation fault...

    Chiunque abbia consigli di qualsiasi tipo dica pure!
    Grazie in anticipo...

  2. #2
    Uppettino... su ragazzi che qui mi segano all'esame

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Il get non estrae il delimitatore dalla stream.
    In pratica il primo get va, ma poi i successivi tirano fuori solo il nulla. Devi fare così:
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    struct persona{
    string nome;
    string cognome;
    string data_nascita;
    };
    
    ifstream in;
    persona database[50];
    
    int apri()
    {
    char nome[50];
    char cognome[50];
    char data[10];
    int k = 0;
    
    in.open("persone.txt");
    if(in.fail())
    {
    cout<<"Errore nell'apertura archivio"<<endl;
    }
    else
    {
    while(!in.eof())
    {
    in.get(nome, 50);
    in.ignore();
    in.get(cognome, 50);
    in.ignore();
    in.get(data, 50);
    in.ignore();
    database[k].nome = nome;
    database[k].cognome = cognome;
    database[k].data_nascita = data;
    k++;
    }
    }
    in.close();
    return k;
    }
    
    int main()
    {
    int n_persone;
    n_persone = apri();
    for(int i = 0; i < n_persone; i++)
    {
    cout<<"Nome: "<<database[i].nome<<endl;
    cout<<"Cognome: "<<database[i].cognome<<endl;
    cout<<"Data di Nascita: "<<database[i].data_nascita<<endl;
    }
    return 0;
    }
    Ora funzionerà. Ciao

  4. #4
    Così mi da ancora segmentation fault...

    Cmq ho risolto con
    codice:
    int apri()
    {
    int k = 0;
    
    in.open("persone.txt");
    if(in.fail())
    {
    cout<<"Errore nell'apertura archivio"<<endl;
    }
    else
    {
    while(!in.eof())
    {
    in >> database[k].nome;
    in >> database[k].cognome;
    in >> database[k].data_nascita;
    k++;
    }
    }
    in.close();
    return k;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    stranissimo perchè sul mio pc funziona quel codice che ti ho postato comunque anche con il metodo che hai usato tu va bene.

  6. #6
    Forse è un problema di sistema operativo... io ho provato solo sotto linux

    Cmq grazie di tutto!

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ora ho capito:
    L'array di char data è troppo piccolo. Deve essere di 11 caratteri. Infatti gg/mm/yyyy sono 10 chars, più il terminatore null sono 11. Prova a fare lo stesso programma facendo l'array di char data di 11 o 12 caratteri.

  8. #8
    Giusto era proprio un problema di lunghezza dell'array...
    Ma ora ho un altro problema... c'è mica qulacuno che sa come dirmi come fare a saltare la lettura dell'ultima linea di un file?

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Puoi fare una prima lettura, segnarti da qualche parte dov'è l'ultima riga e poi quando ci arrivi saltarla.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Tipo così:
    codice:
    int lastpos;
    while(!in.eof())
    {
    	lastpos = in.tellg()-1;
    	in.ignore(80, '\n');
    	in.ignore();
    	cout << lastpos << " " << in.tellg() << "\n";
    }
    in.seekg(0, ios::beg);
    in.sync();
    while(in.tellg()!=lastpos)
    {
            //codice
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.