Domanda di base, ma mi aspettavo che questa struttura occupasse 13 byte di spazio (1 per il char, 12 per i 3 unsigned). Invece, sizeof(ESPR_REL_HEADER)
mi dà 16 byte.Scrive contenuto struct raw (byte) in un file in C. Confuso circa la dimensione effettiva scritta
typedef struct {
unsigned char version;
unsigned int root_node_num;
unsigned int node_size;
unsigned int node_count;
} ESPR_REL_HEADER;
Quello che sto cercando di fare è inizializzare questa struct con alcuni valori e scrivere i dati in esso contenuti (i byte non elaborati) per l'inizio di un file, in modo che quando apro questo file più avanti posso ricostruire questa struttura e ottenere alcuni metadati su cosa contiene il resto del file.
che sto inizializzazione del struct e la scrittura al file in questo modo:
int esprime_write_btree_header(FILE * fp, unsigned int node_size) {
ESPR_REL_HEADER header = {
.version = 1,
.root_node_num = 0,
.node_size = node_size,
.node_count = 1
};
return fwrite(&header, sizeof(ESPR_REL_HEADER), 1, fp);
}
Dove node_size
è attualmente 4 mentre esperimento io.
Il file contiene i seguenti dati dopo scrivo struct ad esso:
-bash$ hexdump test.dat
0000000 01 bf f9 8b 00 00 00 00 04 00 00 00 01 00 00 00
0000010
mi aspetto che contiene in realtà:
-bash$ hexdump test.dat
0000000 01 00 00 00 00 04 00 00 00 01 00 00 00
0000010
scusate il newbiness. Sto cercando di imparare :) Come faccio a scrivere in modo efficiente solo i componenti dati della mia struttura in un file?
Grazie per quello. Quindi, in pratica, si tratta di creare manualmente un array di byte e di scriverlo su disco, quindi quando lo rileggo, copiare i byte da quell'array nei membri di una struct appena allocata? Sto solo imparando davvero, ma mi piacerebbe farlo in un modo che significhi che il file abbia sempre lo stesso formato su tutte le macchine, sì. – d11wtq
@ d11wtq Sì, per la massima portabilità è necessario utilizzare 'memcpy' per copiare i byte dall'array al membro e quindi chiamare' ntohl' (o qualsiasi cosa sia appropriata) per correggere l'ordine dei byte. – Potatoswatter
Eccellente, grazie. Ho qualche lettura da fare. È difficile essere novellini :) – d11wtq