ビットフィールドと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?
'field1'と、彼らは標準のビットではありませんので、' field2'は、理にかなっているようだためビットフィールドを使用している間-widthsでは 'field3'と' dataLenght'はあまり意味がなく、 'uint32_t'と' uint16_t'をそれぞれ使うことができます。また、メモリが制約されているシステムではない場合は、他のデータ構造(ネットワークパケット、ネットワークパケット、または他のデータ構造)と一致させようとしている場合を除いて、ビットフィールドを必要としない( 'data_type'を'ディスク上の構造、または同様のもの)。 –
これはいくつかのケースを処理する例です:)。私はカスタムネットワークパケットを作成しようとしました^^ – jy95
本当にバイナリ形式でファイルを保存する必要がありますか?なぜ、「json」などのようなものはありませんか? 'fscanf'と' fprintf'を使って一貫性のあるファイルのテキスト構造のために読み込みが容易になります。 – AmeyaVS