Ich teste eine benutzerdefinierte Struktur, wo es ein Bitfeld und ein unsigniertes Zeichen * gibt (das wird später zugewiesen). Hierfwrite/fread struct mit bitfields und char *
ist die Struktur:
struct test {
unsigned int field1 : 1;
unsigned int field2 : 15;
unsigned int field3 : 32;
unsigned int dataLength : 16;
unsigned char * data;
}
Das Problem ist, wenn ich versuchte, diese Struktur in einer Datei in hex zu speichern.
Zum Beispiel:
int writeStruct(struct test *ptr, FILE *f) {
// for data, suppose I know the length by dataLength :
// this throw me : cannot take adress of bit field
int count;
count = fwrite(&(ptr->field2), sizeof(unsigned int), 1, f);
// this throw me : makes pointer to integer without a cast
count = fwrite(ptr->field2, sizeof(unsigned int), 1, f);
// same for length
count = fwrite(htons(ptr->data) , ptr->dataLength, 1,f);
// so , how to do that ?
}
Das gleiche Problem geht an fread:
int readAnStructFromFile(struct test *ptr, FILE *f) {
// probably wrong
fread(ptr->field1, sizeof(unsigned int), 1, f);
}
Also, wie kann ich schreiben/Struktur wie das lesen?
Danke für Ihre Hilfe
PS für fread, könnte dies funktionieren, wenn es nicht diese Bitfelder ist: How to fread() structs?
Während bitfields für 'field1' mit und' field2' scheint Sinn zu machen, da sie etwas nicht Standard sind -widths, macht es weniger Sinn für 'field3' und' dataLenght', die 'uint32_t' bzw.' uint16_t' verwenden könnten. Und wenn Sie nicht auf einem System mit eingeschränktem Speicher arbeiten, brauchen Sie oft keine Bitfelder (und verwenden Sie dann 'size_t' für das' dataLength'-Element), es sei denn, Sie versuchen, eine andere Datenstruktur zu finden (Netzwerkpaket, On-Disk-Struktur oder ähnliches). –
Es ist ein Beispiel, mehrere Fälle zu behandeln :). Ich habe versucht, ein benutzerdefiniertes Netzwerkpaket zu erstellen ^^ – jy95
Müssen Sie wirklich die Datei im Binärformat speichern? Warum nicht etwas wie "Json", etc.? Was aufgrund der konsistenten Struktur des Dateitextes mit 'fscanf' und' fprintf' leichter zu lesen wäre. – AmeyaVS