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; //funziona
// char nome[10]; //funziona
}Dato;
void leggi(string nomeFile) //legge i dati dal file
{
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)
{
//apre il file
fstream file(nomeFile, ios::out | ios::in | ios::binary);
//scrive i record sul file
Dato elenco[] =
{
{1,"sandro"},{2, "paolo"},{3,"marco"}
};
for (int i = 0; i < 3; i++) file.write(reinterpret_cast<char*>(&elenco[i]), sizeof(Dato));
//chiude il file
file.close();
}
void verifica(string nomeFile)
{
//se il file non esiste lo crea
ofstream file_t(nomeFile);
if (!file_t)
{
cerr << "il file non esiste e/o non può essere creato";
exit(1);
}
file_t.close(); //chiude il file aperto in sola scrittura
}
int main()
{
string nomeFile = "prova.pro";
verifica(nomeFile);
scrivi(nomeFile);
leggi(nomeFile);
return 0;
}