PDA

Visualizza la versione completa : [c++] Leggere da file usando la gestione c++ like


theboss280489
16-03-2010, 11:22
Salve ragazzi.
Sto incontrando difficoltà nella lettura da file con accesso sequenziale utilizzando i metodi c++ like e non c like.
questa è la mia classe arbitro (vi ricordo che è derivata dalla classe individuo quindi riporto prima quest'ultima)
INDIVIDUO:


#include <string>
using namespace std;
class individuo {
public:
string nome;
string cognome;
int eta;
//Costruttore di default
individuo() {
nome = "";
cognome = "";
eta = 0;
}
//Costruttore
individuo (string name, string surname, int age) {
nome = name;
cognome = surname;
eta = age;
}
//Distruttore
~individuo() {
cout << "Libero la memoria occupata...";
}
};


ARBITRO


#include <iostream>
#include <string>
#include "individuo_class.h"
using namespace std;
//creo la classe arbitro derivata dalla classe individuo
class arbitro: public individuo {
public:
string origine;
//Costruttore di default
arbitro() {
nome = "";
cognome = "";
eta = 0;
origine = "";
}
//costruttore
arbitro(string name, string surname, int age, string born):individuo(name,surname,age) {
origine = born;
}
void visualizza();
};

ora il file cpp con i metodi sulla classe arbitro (in praticolare riportato il metodo visualizza)


#include <iostream>
#include <string>
#include <fstream>
#include "arbitro_class.h"
using namespace std;
void arbitro::visualizza(){
fstream fs;
//apertura del file
fs.open("arbitri.dat",ios::in|ios::binary);
if (!fs.fail()) {
//Il file non esiste non posso visualizzare nessun elenco di arbitri
//Restituisco un messaggio di errore
cout << "\n Il file 'arbitri.dat' e' inesistente.\nNon e' stato inserito nessun arbitro!";
} else {
//Il file esiste quindi è stato inserito almeno un arbitro.
//Stampo i titoli delle colonne
cout << "Nome";
cout << "\tCognome";
cout << "\tEta'";
cout << "\tOrigine";
cout << "\n" << endl;
//Mostro i risultati ordinati per ordine crescente di inserimento
fs.read((char*)this,sizeof(*this));
while(!fs.feof(fs)){
cout << nome;
cout << "\t" << cognome;
cout << "\t" << eta;
cout << "\t" << origine;
cout << endl;
fs.read((char*)this,sizeof(*this));
}
}
fs.close();
}

Ricevo un errore per quando riguarda la riga while(!fs.feof(fs)){
in particolare mi avverte dell'impossibilità di sfruttare feof.
Come mai?

c_junior
16-03-2010, 11:25
hum se non sbaglio per testare l'eof di un fstream si usa:

fs.eof()

che da true se si è giunti alla fine del file o meno, quindi nel while la condizione sarà:

while(!fs.eof())

sebaldar
16-03-2010, 11:30
gli errore mandali su cerr invece che cout.
Riguardo il tuo problema la sintassi corretta è fs.eof()

shodan
16-03-2010, 12:33
Meglio:


while (fs) {
...
}

In modo da testare tutti gli eventuali problemi di lettura.


Originariamente inviato da theboss280489


//Mostro i risultati ordinati per ordine crescente di inserimento
fs.read((char*)this,sizeof(*this));


Diabolicum perseverare :D

Loading