【问题标题】:How to write a struct to a file using fwrite?如何使用 fwrite 将结构写入文件?
【发布时间】:2010-11-11 15:05:38
【问题描述】:

我是 C 的新手,我在使用 fwrite 时遇到了问题。

我希望使用一个包含两个值的结构:

struct keyEncode{
    unsigned short key[2];
    unsigned short encoded[2];
};

然后我在 main 中声明我的结构和指向该结构的指针:

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 没有向文件写入任何内容。

我哪里错了?

【问题讨论】:

  • 删除了 C++ 标签,因为这是 C 代码。
  • 0xffff 是什么?你正在写 65k 条记录?不,这里应该是 1。
  • 你正在做的事情可以想象是好的,但一般来说,编译器被允许在结构的成员之间插入填充。因此,仅将struct 的二进制表示写入磁盘不会在编译器和/或编译器版本和/或编译器设置之间产生一致的结果。

标签: c file file-io struct


【解决方案1】:

您在指针上使用sizeof,这不会计算有效结构的大小,而是指针之一(可能是 4 或 8 个字节)。尝试使用sizeof(struct keyEncode)(如果您使用的是 C++,sizeof(keyEncode) 就足够了)。

那我不明白为什么你有0xFFFF作为计数,不应该只是1吗?

【讨论】:

  • 好的,非常感谢,我不太明白fwrite中的第三个参数,如果你能提供一些见解会很棒???
  • 我也想将结构的值写入二进制文件
  • 第三个参数与size结合使用,如果你想用fwrite写多个项目。基本上写入的字节总数应该是(second parameter * third parameter)。第二个是你定义每个项目的大小,第三个决定你要写多少个,就像你需要写一个数组一样。
  • 第二个参数是你正在编写的每个项目的大小。第三个是你正在写的那些人的数量。它返回实际写入的数字,因此您应该检查返回值以确保一切都按预期进行
  • 是的,如果结构的字段是二进制的,你要用 fwrite 写的是二进制的,如果它们是char * 的话是 ASCII。当然它们会混合在一起。
【解决方案2】:

假设你只有一个这样的结构,那么你需要改变:

fwrite(storedVal, sizeof(storedVal), 0xffff, fp);

fwrite(storedVal, sizeof(*storedVal), 1, fp);

【讨论】:

  • sizeof(storedVal) 将给出指针的大小,而不是指向的类型。应该是sizeof(*storedVal)
  • @Worrier, @Paul:我觉得上面两个cmets可能是我还在编辑的时候写的。
  • 你还没有安装 Telepathy 1.0 吗? ;-)
【解决方案3】:

fwrite() 的参数是要打印的数据、一个数据项的大小、数据项的数量和文件指针。

你有两个尺寸问题:

  1. 您指定“sizeof(storedVal)”,它是指针的大小,而不是结构的大小。
  2. 您指定需要写入其中的 65,535 个。

所以,你需要使用:

 if (fwrite(storedVal, sizeof(*storedVal), 1, fp) != 1)
    ...error handling...

请注意,fwrite() 返回写入的项目数。一般情况下,你有n 的项目要写,你应该检查:

 if (fwrite(storedVal, sizeof(*storedVal), n, fp) != n)
    ...error handling...

【讨论】:

    【解决方案4】:
     // i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors
    

    为此。 storedVal 是指向结构的指针。 C的指针解引用操作符是->所以你想要的

     storedVal->key[0] = k[0];
    

    【讨论】:

      【解决方案5】:
      FILE *fp = fopen("c:\\test", "wb");
      if (fp != NULL) {
          fwrite(storedVal, sizeof(keynEncode), 1, fp);
          fclose(fp);
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      相关资源
      最近更新 更多