【发布时间】:2018-03-12 18:54:06
【问题描述】:
我正在测试一个自定义结构,其中包含位域和无符号字符 *(稍后将分配)。
结构如下:
struct test {
unsigned int field1 : 1;
unsigned int field2 : 15;
unsigned int field3 : 32;
unsigned int dataLength : 16;
unsigned char * data;
}
问题是当我尝试将此结构保存在十六进制文件中时。
例如:
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 ?
}
同样的问题出现在 fread 上:
int readAnStructFromFile(struct test *ptr, FILE *f) {
// probably wrong
fread(ptr->field1, sizeof(unsigned int), 1, f);
}
那么,我怎样才能写/读这样的结构呢?
感谢您的帮助
PS for fread,如果没有这些位域,这可能会起作用:How to fread() structs?
【问题讨论】:
-
虽然为
field1和field2使用位域似乎是有意义的,因为它们不是标准位宽,但对于field3和dataLenght来说意义不大,可以使用@分别为 987654329@ 和uint16_t。而且,如果您不在内存受限的系统上,则通常根本不需要位域(然后将size_t用于dataLength成员),除非您尝试匹配其他一些数据结构(网络数据包,磁盘结构或类似结构)。 -
这是一个处理几种情况的例子:)。我尝试制作自定义网络数据包^^
-
您真的需要以二进制格式存储文件吗?为什么不是
json之类的?由于使用fscanf和fprintf的一致文件文本结构,这将更容易读回。 -
是的,它应该是二进制的,以便其他东西传输它..
-
你明白
s在htons()中的含义吗?
标签: c struct fwrite bit-fields