uReverendo
30-07-2007, 11:49
Devo salvare (e leggere) una stuttura su file. Purtroppo non posso farlo direttamente perchè la struttura contiene un campo string, quindi ho pensato di usare questo metodo:
struct Persona
{
int iUnk1;
int iUnk2;
unsigned char bMd5[16];
string strNome;
};
bool ReadFile(string strFile, vector<Persona> &vp)
{
ifstream f;
unsigned int uiszStruct;
Persona p;
f.open(strFile.c_str(),ios::binary);
if(!f)
{
cout << "Errore" << endl;
return false;
}
uiszStruct = sizeof(Persona) - sizeof(string);
while(!f.eof())
{
f.read((char *)&p, uiszStruct);
ReadString(f, p.strNome);
if(f.good())
{
vp.push_back(p);
}
}
}
bool WriteFile(string strFile, vector<Persona> &vp)
{
ofstream f;
unsigned int uiszStruct;
f.open(strFile.c_str(),ios::binary);
if(!f)
{
cout << "Errore" << endl;
return false;
}
uiszStruct = sizeof(Persona) - sizeof(string);
for(int i=0; i<vp.size(); i++)
{
f.write((char *)&vp[i], uiszStruct);
WriteString(f,vp[i].strNome);
}
}
Così funziona, però è corretto fare in questo modo o si possono verificare dei problemi? Alternative? (oltre al salvataggio campo per campo)
Infine i compilatori allocano SEMPRE i campi della struttura nell'ordine in cui vengono dichiarati (in questo caso int - int - unsigned char - string) oppure a seguito di qualche ottimizzazione l'ordine può essere stravolto?
struct Persona
{
int iUnk1;
int iUnk2;
unsigned char bMd5[16];
string strNome;
};
bool ReadFile(string strFile, vector<Persona> &vp)
{
ifstream f;
unsigned int uiszStruct;
Persona p;
f.open(strFile.c_str(),ios::binary);
if(!f)
{
cout << "Errore" << endl;
return false;
}
uiszStruct = sizeof(Persona) - sizeof(string);
while(!f.eof())
{
f.read((char *)&p, uiszStruct);
ReadString(f, p.strNome);
if(f.good())
{
vp.push_back(p);
}
}
}
bool WriteFile(string strFile, vector<Persona> &vp)
{
ofstream f;
unsigned int uiszStruct;
f.open(strFile.c_str(),ios::binary);
if(!f)
{
cout << "Errore" << endl;
return false;
}
uiszStruct = sizeof(Persona) - sizeof(string);
for(int i=0; i<vp.size(); i++)
{
f.write((char *)&vp[i], uiszStruct);
WriteString(f,vp[i].strNome);
}
}
Così funziona, però è corretto fare in questo modo o si possono verificare dei problemi? Alternative? (oltre al salvataggio campo per campo)
Infine i compilatori allocano SEMPRE i campi della struttura nell'ordine in cui vengono dichiarati (in questo caso int - int - unsigned char - string) oppure a seguito di qualche ottimizzazione l'ordine può essere stravolto?