如何使用fwrite将结构写入文件?
我对C很新,我遇到了fwrite问题。
我想使用一个包含两个值的结构:
struct keyEncode{ unsigned short key[2]; unsigned short encoded[2]; };
然后我在我的main中声明我的struct和指向该struct的指针:
struct keyEncode keynEncode; struct keyEncode *storedVal = &keynEncode;
然后我为结构赋值,并希望使用fwrite将结构写入文件:
keynEncode.key[0] = k1[0]; keynEncode.key[1] = k1[1]; keynEncode.encoded[0] = p[0]; keynEncode.encoded[1] = p[1]; // i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors fwrite(storedVal, sizeof(storedVal), 0xffff, fp);
现在我的问题是fwrite没有写任何文件。
我哪里错了?
您在指针上使用sizeof
,这不会计算有效结构的大小,而是指向其中一个指针(可能是4或8个字节)。 尝试使用sizeof(struct keyEncode)
(如果使用C ++, sizeof(keyEncode)
就足够了)。
然后我不明白为什么你有0xFFFF
作为计数,不应该只是1
?
假设你只有一个这样的结构,那么你需要改变:
fwrite(storedVal, sizeof(storedVal), 0xffff, fp);
至
fwrite(storedVal, sizeof(*storedVal), 1, fp);
fwrite()
的参数是要打印的数据,一个数据项的大小,数据项的数量和文件指针。
尺码有两个问题:
- 您指定’
sizeof(storedVal)
‘,它是指针的大小 – 而不是结构的大小。 - 您指定需要编写65,535个。
所以,你需要使用:
if (fwrite(storedVal, sizeof(*storedVal), 1, fp) != 1) ...error handling...
请注意, fwrite()
返回写入的项目数。 在一般情况下,您有n
个要写的项目,您应该检查:
if (fwrite(storedVal, sizeof(*storedVal), n, fp) != n) ...error handling...
// i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors
对于这个。 storedVal是指向struct的指针。 C的指针解引用运算符是 – >所以你想要的
storedVal->key[0] = k[0];
查看您的变量定义,并查看您在sizeof调用中使用的变量。 指定指针的大小而不是数据的大小是否正确? 另外检查你对fwrite的使用,我认为你错误地指定了“count”参数。 它被定义为
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
count参数指定要写入文件的大小大小的块数 。
我真的不想马上给你答案(别人可能会),因为这被标记为家庭作业 – 你应该学习:)
FILE *fp = fopen("c:\\test", "wb"); if (fp != NULL) { fwrite(storedVal, sizeof(keynEncode), 1, fp); fclose(fp); }