如何使用fwrite将结构写入文件?

时间:2010-11-11 15:05:39

标签: c file file-io struct

我是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没有写任何文件。

我哪里错了?

6 个答案:

答案 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()的参数是要打印的数据,一个数据项的大小,数据项的数量和文件指针。

尺码有两个问题:

  1. 指定“sizeof(storedVal)”,这是指针的大小 - 而不是结构的大小。
  2. 您指定需要写入65,535个。
  3. 所以,你需要使用:

     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 数量

我真的不想立即给你答案(其他人可能会),因为这被标记为家庭作业 - 你应该学习:)