Newsgroup: it.comp.lang.c++
Titolo: stream su disco

Grazie per l'attenzione.
Sto trovando un sacco di problemi per leggere un file su cui precedentemente
ho salvato alcuni dati:
int main() // per scrivere
{
 char name[20] = "SaveFile1.dat";
 int modeS = (ios::out | ios::binary );
 fstream StreamSuDisco(name,modeS);
 record c("Carl" , "77123/8" ,22,3,63, 725);  // classe record dichiarata e
definita
 StreamSuDisco << c;    //  inserisce c su outstream
 return 0;
}
a questo punto, nella directory esiste un file SaveFile1.dat contenente il
record c.
Allora modifico main.cpp per leggere il record dal file:
int main() // per leggere
{
 double n = 25;
 char name[20] = "c:SaveFile1.dat";
 int modeL = (ios::in | ios::binary);
 fstream StreamSuDisco(name,modeL);
 record c;
 StreamSuDisco >> c;  // qui ( se non sbaglio ) dovrebbe copiare in c il
record contenuto nel file
 cout << c;
 StreamSuDisco.close();
 return 0;
}
L'unica cosa che mi esce sul monitor e' un record nullo contenente tutti
zero.
Ovviamente nella classe record ho implementato operator <<  e  operator >> ,
assieme a costruttore di copia e di assegnamento.
Vi ringrazio per ogni vostro aiuto, io non so piu' dove sbattere la testa!

 Ovviamente nella classe record ho implementato operator <<  e  operator >> ,
Forse dovresti farci vedere come li hai implementati.
EMG

 EMG
 friend istream& operator >> ( istream& in, record& rcd)
 {
  in >> rcd.indiceOprz >> rcd.nome  ;  // rcd.indiceOprz e' un int ;
rcd.nome e' un oggetto  appartenente ad
                                                          // un'altra classe
contenuto in record
  return in;
 }
 friend ostream& operator << ( ostream& out, const record& rcd)
 {
  out << rcd.nome  << rcd.indiceOprz ;
  return out ;
 }
Per quel che riguarda il dato membro .nome ,nella classe di appartenenza ho
cosi implementato << e >> :
 friend ostream& operator << (ostream& out,const Banca& b_out)
 {
  out << b_out.NomeBanca << b_out.NumeroConto ; // elemento appartenente ad
altra classe
  return out;
 }
 friend istream& operator >> (istream& in , Banca& b_in)
 {
  in >> b_in.NomeBanca >> b_in.NumeroConto;
  return in;
 }
Stesso discorso per .NumeroConto:
 friend ostream& operator << (ostream& out,const conto& c_out)
 {
  out << c_out.Contocorrente << c_out.DataDellOperazione<< c_out.ammontare ;
  return out ;
 }
 friend istream& operator >> (istream& in, conto& c_in)
 {
  in >> c_in.Contocorrente >> c_in.DataDellOperazione >> c_in.ammontare; //
.Contocorrente e' una string e .ammontare e'
// un double;DataDellOperazione e' un oggetto
// di tipo Data del quale riporto le impl.di << e
// >>
  return in ;
 }
Questa e' l'implementazione per la classe Data :
 friend ostream& operator << (ostream& out,const Data& d)
 {
  out << d.giorno << d.mese <<  d.anno ;
  return out ;
 }
 friend istream& operator >> (istream& in,Data& d)
 {
  in >> d.giorno >> d.mese >> d.anno ;
  return in ;
 }
E questo e' tutto; in caso servisse qualche altra informazione, fammelo
sapere.
Molte grazie per l'attenzione e per gli eventuali ( graditissimi )
suggerimenti.
Ciao.

  friend istream& operator >> ( istream& in, record& rcd)
Boh, non riesco a vedere niente di strano (sicuramente per miei limiti).
Magari se mi mandassi (in e-mail) un esempio compilabile sarebbe pių
facile trovare l'errore.
EMG

 Ciao.
Ciao.
Devi separare in qualche modo i dati che inserisci nello stream (ad
esempio con spazi o tab)
altrimenti quando provi a rileggere il file ottieni una sola stringona
con tutti i dati attaccati.
Ad esempio, (salvando solo una data su un file) l' operatore << per la
classe data scriverebbe 2642001
 (tutto attaccato) e l'operatore >> valorizzerebbe d.giorno col numero
2642001 e lascerebbe indefiniti 
d.mese e d.anno. Lo stesso vale in generale per tutti gli altri membri.
Quello che succede col tuo file e che, a causa di questi problemi, le
letture si sfasano (il primo numero
letto, prende tutti i caratteri del file fino al primo non-numero, i
numeri seguenti prendono zero, la
prima stringa letta prende tutti i caratteri del file fino a un blank, e
cosi via)
In generale e' sufficiente provare ad aprire il file salvato con un
qualsiasi editor per accorgersi
di questo tipo di problemi.
Nota inoltre che, se le stringhe che usi per nomi o descrizioni varie
possono contenere spazi o tab,
la cosa si complica ulteriormente in fase di rilettura. 
Buon lavoro,
Fabio


Grazie per il suggerimento : in effetti inserendo tab e spazi tutto funziona
( ed e' sparita la "stringona" ...);
Una sola cosa non ho capito del messaggio di Fabio : [snip] cosa vuol dire?
Di nuovo grazie e ciao.

 [snip] cosa vuol dire?
Standard Notation Instruction Pointer
Serializable Non-Interruptable Powersupply
Sono Nuovo In Pista
Ho Tagliato Un Po Del Messaggio Originale
...
Scegli tu... 8)
Luc.

"Luc" <TOGL...@katamail.com-TOGLI> wrote in message
news:468iet4m4v3cpmn98...@4ax.com...

Un aiutino? E' onomatopeico e non e' un acronimo.
--
Andrea Ferro
P.S.: non postate chiedendo cosa significano onomatopeico e acronimo. Nel caso
provate con 
http://www.garzanti.it
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556