View Full Version : Strutture e files in C++
Salve ragazzi, vorrei sapere come si fa a salvare una struttura in un file. Tale struttura possiede un campo unsigned char* ed un campo int. In particolare, ho un'array di strutture da salvare in un file.Grazie.
Ci sono tanti modi per salvare una struttura in un file...
Ad esempio:
struttura s;
....
....
....
ofstream out( "out.dat", ios::binary );
out.write((char*)&s, sizeof(char)*sizeof(struttura));
Questo funziona perfettamente quando i dati da salvare sono allocati staticamente, ma se i dati (come suppongo nel tuo caso) sono allocati dinamicamente ti conviene salvare la struttura membro a membro...
Supponendo struttura in questo modo e che m2 sia la lunghezza di m1 (ci ho beccato ?):
struct struttura
{
unsigned char *m1;
int m2;
};
struttura s;
....
....
....
ofstream out( "out.dat", ios::binary );
out.write((char*)&s.m2, sizeof(int));
out.write((char*)s.m1, sizeof(unisgned char)*m2);
Per la lettura si fa l'operazione inversa con la read...
Allora,
io ho definito il seguente array di strutture:
struct { unsigned char *code;
int nbit;
}Codici[256];
Nel main ho scritto:
ofstream out("D:/out.dat",ios::binary);
for(int g=0;g<256;g++){
out.write((char*)(Codici[g].code),sizeof(unsigned char)*code);
out.write((char*)&(Codici[g].nbit),sizeof(nbit));
}
Pero' non mi riconosce ne' il simbolo code ,nè nbit. cosa ho sbagliato?
Così:
ofstream out("D:/out.dat",ios::binary);
for(int g=0;g<256;g++){
out.write((char*)&(Codici[g].nbit),sizeof(int));
out.write((char*)(Codici[g].code),sizeof(unsigned char)*dimensione);
//dimensione deve essere il numero di unsigned char allocati per il membro code
}
Dunque,
ho scritto:
ofstream out("D:/out.dat",ios::binary);
for(int g=0;g<256;g++){
out.write((char*)&(HuffmanCodes[g].nbit),sizeof(int));
out.write((char*)(HuffmanCodes[g].code),sizeof(unsigned char)*256);
}
ma mi da' un'errore alla riga
ofstream out("D:/out.dat",ios::binary);
di violazione di accesso nella classe template :
template <class _CharT, class _Traits>
Quindi non credo dipenda dal codice che ho scritto. In pratica non riesce a creare il file di output. Non so come mai.
Come dimensione ho provato anche ((numeroalberi-1)+8)>>3), dove numero alberi è appunto il numero degli alberi creati con il metodo di Huffman, ed è la dimensione usata quando ho scritto il codice nella struttura in questione. Solo che il problema lo dà prima di entrare nel ciclo for, quindi non ho idea da cosa dipenda.
A me il codice sotto funziona benissimo con il compilatore MinGW32...scommetto che stai usando Visual C++...
ofstream out("D:\\out.dat",ios::binary);
out.write("pippo", 5);
Altrimenti prova in questo modo:
ofstream out;
out.open("D:\\out.dat",ios::binary);
out.write("pippo", 5);
Altrimenti prova così:
fstream out;
out.open("D:\\out.dat",ios::out || ios::binary);
out.write("pippo", 5);
No amico, sto usando il C++Builder X
Dunque, un po' è migliorato. Ho scritto:
fstream out2;
out2.open("D:\\out.dat",ios::out || ios::binary);
int q;
while(!feof(in3))
{q=fgetc(in3);
if(q>=0)
{ out2.write((char*)&(HuffmanCodes[q].nbit),sizeof(int));
out2.write((char*)(HuffmanCodes[q].code),sizeof(unsigned char)*((numeroalberi-1)+8)>>3);
}
}
Adesso, alla riga con l'intero non dà problemi o meglio, me li dà dopo qualche ciclo, ma a quella successiva si, sempre di violazione di accesso.
Dunque, ho inserito il codice usando l'ofstream direttamente nella funzione in cui riempo la struttura.Ad ogni codice inserito, segue la scrittura sul file out.dat. In questo modo sembra funzionare, il file lo crea e non dà alcuna eccezione. Certo che sono strani questi compilatori :))
Comunque grazie, se avro' altri problemi ti ricontattero', ciao ciao.
Comunque:
sizeof(unsigned char)*(((numeroalberi-1)+8)>>3)
Ok, la struttura l'ho salvata. Adesso ,tramite la read, come ricreo la struttura? Tale funzione vuole un buffer di ingresso ed una lunghezza prefissata. COme le imposto tutte e due partendo dal fil eaperto in cui vi è salvata la struttura? Inoltre come riconosco se quello letto è un campo unsigned char* o int?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.