2017-10-01 3 views
0

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?

+1

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). –

+0

Es ist ein Beispiel, mehrere Fälle zu behandeln :). Ich habe versucht, ein benutzerdefiniertes Netzwerkpaket zu erstellen ^^ – jy95

+0

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

Antwort

1

gibt es keine Möglichkeit, eine Adresse eines bitfield zu bekommen. Der übliche Weg, um damit umzugehen, besteht darin, entweder eine temporäre Variable auf Lese/Schreib-Seiten zu verwenden oder nur die gesamte Struktur als eine einzelne Einheit zu speichern. Mit Temp Vars es wie folgt aussieht:

int count; 
int field2 = ptr->field2; 
count = fwrite(&field2, sizeof(unsigned int), 1, f); 
... 
int field1; 
fread(&field1, sizeof(unsigned int), 1, f); 
ptr->field1 = field1; 

oder für die ganze Struktur:

count = fwrite(ptr, sizeof(struct test), 1, f); 
+0

danke: ich werde deine erste Idee testen. Glaubst du, dass der ganze struct fwrite nicht funktioniert, weil der Zeiger drin ist? – jy95

+0

In Ihrem Fall wird das ganze Struct Write nicht funktionieren. Es wird nicht die Daten selbst schreiben, nur der Datenzeiger, der keinen Sinn ergibt. – Serge

+0

Der Vorschlag ist, es in 2 Teile zu teilen: Header und die Daten. Den Header könntest du als ganzes schreiben – Serge