PDA

Visualizza la versione completa : [C++] Gestione file


cattateo1
17-12-2004, 15:46
Come faccio a scaricare e caricare una lista composta da struct su un file senza dover scrivere e leggere campo per campo???
Ho provato per scaricare sul file con:
fout<<primo_cl->cognome<<" "<<primo_cl->nome<<" "<<primo_cl->cod_fiscale<<" "<<primo_cl->citta<<" "<<primo_cl->indirizzo<<" "<<primo_cl->num_tel;
ma è troppo lungo!!

Help me!!

Rispondete il prima possibile sono in crisi....

cikko
17-12-2004, 16:12
Supponiamo una struct di nome Person:

Person person;
ifstream fin("tuofile.dat");
// in un ciclo
fin.read(reinterpret_cast<char*>( &person ), sizeof(Person));
per la scrittura è lo stesso (naturalmente devi dichiarare un oggetto ofstream ed utilizzare il metodo write)

cattateo1
17-12-2004, 17:04
A parte che hai tutta la mia stima..
Cosa vuol dire <char*>??

cikko
18-12-2004, 12:52
Originariamente inviato da cattateo1
A parte che hai tutta la mia stima..
Cosa vuol dire <char*>??
Ciao,
ci provo, ma poi devi approndire con un buon libro (o anche su internet):
la funzione read di ifstream richiede come primo parametro un puntatore a char, e come secondo il numero di byte da leggere.
Quindi utilizziamo il reinterpret_cast<char*> (il cast usato per le conversioni non standard) per convertire, appunto, l'indirizzo di person in un puntatore a char*.
Spero di essere stato chiaro.

pprllo
18-12-2004, 13:11
Perdonatemi l'intrusione, ma a me la stessa cosa non funziona ... Cioè mi tira fuori una stringa che non ci azzecca niente con quella che ho inserito. E' una questione di ambiente/compilatore ? Che io sappia il reinterpet_cast non sempre va a buon fine. Io questa cosa qui la farei con l'overload degli operatori, che è sicuro al 100%. Così:


struct esempio
{
char *b;
int a;
friend ostream &operator<<(ostream &o, esempio a)
{
o << a.b << " " << a;
return o;
}
friend istream &operator>>(istream &i, esempio a)
{
i >> a.b >> a;
return i;
}
};

cikko
18-12-2004, 19:20
Non lo so se e' una questione di ambiente o compilatore perche' non ho provato. Comunque quel codice compilato con g++ da un risultato corretto.
Interessante l'alternativa con gli overload degli operatori.

pprllo
18-12-2004, 19:23
Probabilmente è una questione di ambiente allora giacchè io sono su Windows e mi tira fuori 3 caratteri indecifrabili. Comunque io personalmente preferisco sempre utilizzare l'overload degli operatori per avere la massima sicurezza/flessibilità e poi vuoi mettere lo sfizio di usare le prerogative OO del linguaggio ? :D Poi, de gustibus non disputandum est (è la seconda volta che lo dico oggi :D)

P.S.: Sono sicuro che reinterpret_cast, negli ambienti in cui funziona, è molto più veloce della soluzione che ho proposto io. :D

Loading