PDA

Visualizza la versione completa : [c++] file e classi


aeroplanino
13-02-2004, 21:28
non riesco a salvare su file oggetti di classe da me creata,come posso fare???

ad esempio ho creato una classe libro,poi edito:

libro libro1;
ofstream f2("archivio",ios::app);
f2<<libro1; //qui sorge il problema perche' l'operator << non e' definito per class libro
f2.close();

Angioletto
13-02-2004, 21:34
bisogna ridefinire l'operatore >> !!



struct Articolo {
char* nome;
char* misura;
int quantita;
};

typedef Articolo* PArt;

istream& operator >> (istream& in, PArt p)
{
char temp[80];
cout << "Nome dell'articolo: ";
in >> temp;
p->nome = new char[strlen(temp)+1];
strcpy(p->nome, temp);
cout << endl;

cout << "Quantita' da comprare: ";
in >> p-> quantita;
cout << endl;

cout << "Unita' di misura: ";
in >> temp;
p->misura = new char[strlen(temp)+1];
strcpy(p->misura, temp);
cout << endl;

return in;
}

ostream& operator << (ostream& out, const PArt p)
{
out << p->quantita << " " << p->misura << " di " << p->nome << endl << endl;
return out;
}

Ti va bene come esempio??

aeroplanino
14-02-2004, 00:15
ma e' necessario l'utilizzo dell'operatore -> ?

non ne conosco l'uso....

Angioletto
14-02-2004, 10:56
conviene che impari ad usarlo..
Nel main del programma si definirà una istanza del Record Articolo (avrai dunque occupato spazio in memoria)


Articolo a;

Ci sono vari modi per accedere ai campi di tale record..

a.nome;
a.misura;
a.quantita;

Penso che tu conosci questo tipo di funzione di accesso. Nel nostro caso trattiamo il Record Articolo attraverso dei puntatori: conviene sempre quando l'oggetto in memoria ha una certa estensione in memoria!!)



Articolo a;
typedef Articolo* PArt;
PArt p;
p=&a;


Ecco come attraverso i puntatori si può accedere ai campi del Record:


(*p).nome;
p->nome;

Questa notazione è molto comoda, in quanto "letteralmente" ti dice che stai puntando al campo nome (in p c'è sempre l'indirizzo di a!!)

A presto!!!

aeroplanino
16-02-2004, 22:59
ho risolto il problema del salvataggio ma ora rimane il grande problema della lettura del file:

per esempio se il mio oggetto libro ha tre campi(char[] autore,char[] titolo,int anno)e ci ho inserito manzoni,promessi sposi,1647 sul file viene salvato:

manzonipromessi sposi1647

come posso leggere il file in modo di mandare i vari campi al loro giusto posto in un oggetto di classe libro??

Angioletto
17-02-2004, 00:46
è un problema che ancora non mi è capitato..posso provare a darti qualche idea..

pensavo di salvare i vari dati con dei ritorni a capo ("/t" mi sembra), poi bisognerebbe trovare la giusta funzione che legge i caratteri fino a quell'operatore (cin.get, cin.getline, etc etc), ma non so quale possa essere quella funzione..e infine ridefinire l'operatore di ingresso per adattarlo alla lettura da file..

non so, è la prima idea che mi è venuta in mente.

una volta letti i dati potresti poi darli in pasto ad un costruttore con parametri dell'oggetto libro...

dimmi un pò che ne pensi!!

purtroppo sto appresso ad un altro esame, se no avrei provato a fare sta cosa!!!

Ciao!!

aeroplanino
17-02-2004, 13:45
anche io avevo pensato qualcosa del genere,provero' cosi' poi ti sapro' dire...

aeroplanino
17-02-2004, 16:21
mi e' venuto un dubbio:ma esiste la funzione getline nella classe istream??

Angioletto
17-02-2004, 17:33
ho provato una cosa del genere, ma non ho avuto molto tempo per perfezionarla..

while ( (infile>>s)!='\0' )

dove infile è il nome interno che ho dato ad un file aperto per sola lettura..
la lettura termina quando trova il tappo (\0), dovrebbe accadere la stessa cosa se ovviamente al posto del tappo metti qualche altra cosa, ad esempio il \t di cui parlavamo l'altra volta..

il problema che ho è un'altro: come faccio a dire al programma che alcune stringhe deve inserirle in una variabile e altre in variabili diverse?? cioè, magari il primo inserimento va bene, ma poi come gli dico di spostarsi sulle altre stringhe??

non so se mi sono spiegato bene..cmq penso che incontrerai cmq qst problema..mah!!!

speriamo sia + semplice di quanto io creda..

ciao!!

aeroplanino
17-02-2004, 18:04
ma dove lo inserisci

while ( (infile>>s)!='\0' ) ??

funziona? hai provato?


per il problema che dici tu non e' difficile,se tu riesci a farlo leggere fino al punto che vuoi(\n,\o...)poi se non chiudi lo stream di input e fai partire una nuova lettura la nuova lettura partira'da dove si e' fermata l'altra...capito??

Loading