2017-10-01 21 views
0

ビットフィールドとunsigned char *(後で割り当てられる)があるカスタム構造体をテストしています。ここでビットフィールドとcharを持つfwrite/fread構造体*

は構造体である:

struct test { 
    unsigned int field1 : 1; 
    unsigned int field2 : 15; 
    unsigned int field3 : 32; 
    unsigned int dataLength : 16; 
    unsigned char * data; 
} 

Iヘクス内のファイルの内部でこの構造体を保存しようとしたときに問題があります。例えば

:同じ問題が関数freadに行く

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 ? 
} 

int readAnStructFromFile(struct test *ptr, FILE *f) { 
    // probably wrong 
    fread(ptr->field1, sizeof(unsigned int), 1, f); 
} 

だから、私は書くことができますどのように/このように構造体を読みますか?これらのビットフィールドがなかった場合は、あなたの助けにfreadのための

PS用

おかげで、これは仕事ができる:How to fread() structs?

+1

'field1'と、彼らは標準のビットではありませんので、' field2'は、理にかなっているようだためビットフィールドを使用している間-widthsでは 'field3'と' dataLenght'はあまり意味がなく、 'uint32_t'と' uint16_t'をそれぞれ使うことができます。また、メモリが制約されているシステムではない場合は、他のデータ構造(ネットワークパケット、ネットワークパケット、または他のデータ構造)と一致させようとしている場合を除いて、ビットフィールドを必要としない( 'data_type'を'ディスク上の構造、または同様のもの)。 –

+0

これはいくつかのケースを処理する例です:)。私はカスタムネットワークパケットを作成しようとしました^^ – jy95

+0

本当にバイナリ形式でファイルを保存する必要がありますか?なぜ、「json」などのようなものはありませんか? 'fscanf'と' fprintf'を使って一貫性のあるファイルのテキスト構造のために読み込みが容易になります。 – AmeyaVS

答えて

1

は、ビットフィールドのアドレスを取得する方法はありません。これを処理する通常の方法は、読み取り/書き込み側で一時変数を使用するか、構造体全体を単一のエンティティとして保存することです。

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; 

または全体の構造体のために:一時では、次のように見えるvarsの

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

ありがとう:私はあなたの最初のアイデアをテストします。あなたは内部のポインタのためにstruct fwrite全体が動作しないと思いますか? – jy95

+0

あなたのケースでは、構造体全体の書き込みは機能しません。それは、データそのものを書き込むのではなく、意味のないデータポインタだけを書きます。 – Serge

+0

提案はヘッダーとデータの2つの部分に分割することです。あなたが全体として書くことができるヘッダ – Serge

関連する問題