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

尺码有两个问题:

  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... 
  // 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); }