PDA

View Full Version : Strutture e files in C++


Unrue
29-07-2005, 15:19
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.

cionci
29-07-2005, 17:30
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...

Unrue
29-07-2005, 18:11
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?

cionci
29-07-2005, 18:32
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
}

Unrue
30-07-2005, 11:02
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.

cionci
30-07-2005, 11:11
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);

Unrue
30-07-2005, 12:02
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.

Unrue
30-07-2005, 12:21
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.

cionci
30-07-2005, 14:18
Comunque:

sizeof(unsigned char)*(((numeroalberi-1)+8)>>3)

Unrue
04-08-2005, 17:28
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?