|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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.
Ultima modifica di Unrue : 29-07-2005 alle 14:26. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 } |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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. Ultima modifica di Unrue : 30-07-2005 alle 10:06. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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); |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque:
sizeof(unsigned char)*(((numeroalberi-1)+8)>>3) |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6165
|
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?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:02.