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