In questi giorni ho fatto qualche prova per capire il funzionamento di questa "benedetta" lettura/scrittura su file
Ho seguito le tue indicazioni mettendo nella struttura un puntatore a char o un array, in entrambi i modo non ho piu errori. Però sono andato un po avanti ed ho notato una cosa che non capisco.
Come vedi dal listato sotto ho diviso l'esecuzione in 3 funzioni distinte:
verifica() > serve per creare il file prova.pro se non esiste
scrivi() > scrive i dati sul file
leggi() > legge i dati dal file
Dalla seconda esecuzione il file è creato e scritto con i dati, quindi non lanciando la funzione scrivi (stessa cosa anche se levo verifica e scrivi) non dovrebbe cambiare niente.... e invece no!! perchè nuovamente c'è un errore di lettura della memoria nel momento in cui vado a stampare su schermo i dati col cout<<.
Non riesco a c aprire perche... eppure le funzioni sono tutte scollegate con i singoli oggetti che si creano e si distruggono al loro interno e non c'è piu la variabile string nella struttura che da problemi col puntatore e, d'altronde, le la finz leggi() fosse scritta male l'errore sarebbe emerso anche in abbinata con la funzione scrivi().... però non va!! cosa mi sfugge??
ciao e grazie
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
typedef struct Dato
{
int id;
const char *nome;
}Dato;
void leggi(string nomeFile)
{
ifstream file(nomeFile, ios::in | ios::binary);
if (!file)
{
cerr << "errore in apertura scrivi";
exit(1);
}
Dato temp;
for (int i = 0; i < 3; i++)
{
file.read(reinterpret_cast<char*>(&temp), sizeof(Dato));
cout << temp.id << " - " << temp.nome << endl;
}
file.close();
}
void scrivi(string nomeFile)
{
fstream file(nomeFile, ios::out | ios::in | ios::binary);
Dato elenco[] =
{
{1,"sandro"},{2, "paolo"},{3,"marco"}
};
for (int i = 0; i < 3; i++) file.write(reinterpret_cast<char*>(&elenco[i]), sizeof(Dato));
file.close();
}
void verifica(string nomeFile)
{
ofstream file_t(nomeFile);
if (!file_t)
{
cerr << "il file non esiste e/o non può essere creato";
exit(1);
}
file_t.close();
}
int main()
{
string nomeFile = "prova.pro";
verifica(nomeFile);
scrivi(nomeFile);
leggi(nomeFile);
return 0;
}