sempre_alex ha scritto:
Allora praticamente mediante la funzione carica() apro il file Abbonamenti.dat e inserisco tutte le varie informazioni degli abbonati, fin qui tutto bene.
Tutto male invece. Non puoi scrivere un oggetto complesso come una std::string in maniera binaria come faresti con una char q[30] (per esempio), ne tantomeno leggerla.
Dato che Abbonamento contiene una struttura
dati_a, che a sua volta contiene std::string, in scrittura puoi avere una corruzione dei dati (dipende dall'implementazione interna di std::string).
Quando vai a leggere la stessa struttura abbonamento, però, le std::string non sono inizializzate e questo comporta l'errore di runtime.
La soluzione più semplice è definire data_as come:
struct dati_a{
char cognome[64];
char nome[64];
char citta[64];
char indirizzo[64];
float prezzo;
};
e manipolare i dati di conseguenza. Purtroppo questo è uno dei pochi casi in cui non è possibile usare le std::string per la scrittura binaria su file.
In alternativa puoi scrivere in formato testo (separato magari da un tab) in questo modo:
void carica(){
struct dati_a vals;
Abbonamento abb;
fstream f(file_abb,ios::in|ios::out);
if(!f){
cout<<"Errore nel file.\n";
return;
}
cout<<"INSERIMENTO ABBONATI\n"<<endl;
for(int i=0;i<=NUM_ABB-1;i++){
cout<<"ID: "<<i+1<<"\n";
vals.nome=request<string>("\tNome");
vals.cognome=request<string>("\tCognome");
vals.citta=request<string>("\tCitta");
vals.indirizzo=request<string>("\tIndirizzo");
vals.prezzo=request<float>("\tPrezzo");
abb.set(vals,i+1);
f << vals.nome << '\t' << vals.cognome << '\t';
f << vals.citta<< '\t' << vals.indirizzo<< '\t';
f << vals.prezzo<< endl;
}
f.close(); // non strettamente necessaria
}
Ovviamente la funzione visualizza va totalmente cambiata.
Devi leggere una riga alla volta, parserizzarla per trovare i vari token, inserire tali token in una struttura data_a, inserire tale struttura nella classe Abbonamento (c'è un costruttore apposta mi pare) e poi puoi stampare senza avere problemi.