Duchamp
14-01-2011, 21:59
Ciao a tutti e perdonatemi il titolo pittoresco!
Mi trovo di fronte ad un caso stranissimo: ho una struct di questo tipo:
struct Data {
char txt[9];
float val;
..... (altri dati)
} data;
che vado a scrivere in binario su un file. Nessun problema.
Poi in un altro momento voglio leggerne i primi due valori: apro il file e procedo con fread:
FILE *fh = fopen(......, "rb");
char tmp_txt[9];
float tmp_val;
fread(&tmp_txt, sizeof(char), sizeof(tmp_txt), fh);
res = fread(&tmp_val, sizeof(float), 1, fh);
Nessun problema anche per il tmp_txt, ma incomprensibili (per me) risultati nel float. Dopo un po' di analisi con editor esadecimali ho notato che all'interno del file binario il valore che voglio pescare è al byte con offset 12 (char da 0 a 8, float da 9 a 12) ma il programma legge, per il float, ciò che sta a offset 9, ovvero esattamente dopo la stringa.
Workaround trovato fino ad ora: aggiungere
fseek(fh, 3, SEEK_CUR);
tra una chiamata di fread e l'altra.
Io sinceramente non me lo so spiegare; sarà che è la prima volta che scrivo float in binario, sarà che google non mi ha mostrato nulla di utile se non una questione relativa al padding delle struct... potrebbe essere?
Spero possiate darmi qualche informazione in più!
Vi ringrazio in anticipo :)
Mi trovo di fronte ad un caso stranissimo: ho una struct di questo tipo:
struct Data {
char txt[9];
float val;
..... (altri dati)
} data;
che vado a scrivere in binario su un file. Nessun problema.
Poi in un altro momento voglio leggerne i primi due valori: apro il file e procedo con fread:
FILE *fh = fopen(......, "rb");
char tmp_txt[9];
float tmp_val;
fread(&tmp_txt, sizeof(char), sizeof(tmp_txt), fh);
res = fread(&tmp_val, sizeof(float), 1, fh);
Nessun problema anche per il tmp_txt, ma incomprensibili (per me) risultati nel float. Dopo un po' di analisi con editor esadecimali ho notato che all'interno del file binario il valore che voglio pescare è al byte con offset 12 (char da 0 a 8, float da 9 a 12) ma il programma legge, per il float, ciò che sta a offset 9, ovvero esattamente dopo la stringa.
Workaround trovato fino ad ora: aggiungere
fseek(fh, 3, SEEK_CUR);
tra una chiamata di fread e l'altra.
Io sinceramente non me lo so spiegare; sarà che è la prima volta che scrivo float in binario, sarà che google non mi ha mostrato nulla di utile se non una questione relativa al padding delle struct... potrebbe essere?
Spero possiate darmi qualche informazione in più!
Vi ringrazio in anticipo :)