PDA

Visualizza la versione completa : [c++] lettura da file per gestione iscrizioni


zero85
27-12-2004, 14:49
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...


#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...

zero85
27-12-2004, 21:17
Uppettino... su ragazzi che qui mi segano all'esame :cry:
:stordita: :stordita: :stordita:

pprllo
27-12-2004, 22:14
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ì:


#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 :)

zero85
27-12-2004, 22:42
Così mi da ancora segmentation fault...

Cmq ho risolto con


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;
}

pprllo
27-12-2004, 23:05
stranissimo perchè sul mio pc funziona quel codice che ti ho postato :) comunque anche con il metodo che hai usato tu va bene.

zero85
27-12-2004, 23:09
Forse è un problema di sistema operativo... io ho provato solo sotto linux :unz:

Cmq grazie di tutto! :ciauz:

pprllo
27-12-2004, 23:12
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.

zero85
28-12-2004, 18:22
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? :confused:

pprllo
28-12-2004, 22:35
Puoi fare una prima lettura, segnarti da qualche parte dov'è l'ultima riga e poi quando ci arrivi saltarla.

pprllo
28-12-2004, 23:05
Tipo così:


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
}

Loading