将int写入C中的二进制文件时出现问题

我需要使用C的I / O函数将数据写入二进制文件。 以下代码导致运行时exception:

#include "stdio.h" int main(int argc,char* argv[]) { FILE *fp = fopen("path_to_file.bin","wb"); if(fp == NULL) { printf("error creating file"); return -1; } int val = 4; fwrite((const void*)val,sizeof(int),1,fp); fclose(fp); return 0; } 

代码在fwrite处死掉。 你能发现我做错了什么吗? 显然,我正试图访问0x0000004或类似的数据。

谢谢 !

  fwrite((const void*)val,sizeof(int),1,fp); 

应该:

  fwrite((const void*) & val,sizeof(int),1,fp); 

顺便说一句,如果您不使用演员表,您将收到合理的错误消息。 C(和C ++)程序员经常使用强制转换程序,这是一个很好的经验法则,“如果它需要演员,它可能是错误的”。

我认为尼尔的答案可以改进。 我意识到它已经被接受了,所以这只是为了展示一些对比(这就是为什么我不只是编辑他的原因)。

 fwrite(&val, sizeof val, 1, fp); 

两项改进:

  • 没有指针转换,因为在C中没有必要并且可以隐藏错误。
  • 直接在对象上使用sizeof ,因为这是您传递指针的内容。 对我来说很有意义,比重复自己和使用类型名称更安全。

添加到Neil的答案:当您在同一平台上阅读和编写文件时,这是有效的。 如果您在具有不同字节序的平台上阅读/编写,事情会变得奇怪。

 #include "stdio.h" int main(int argc,char* argv[]) { FILE *fp = fopen("path_to_file.bin","wb"); if(fp == NULL) { printf("error creating file"); return -1; } int val = 4; fwrite((const void*)val,sizeof(int),1,fp); 

你应该提供一个非整数的地址。

另外,你不应该以这种方式使用整数:

  1. 它可能在不同计算机上的字节顺序上有所不同(如上所述)
  2. 它的大小可能不同。 在真正的旧计算机上,它可能是1或2个字节。 在大多数现代它将是4但它也可能是8(一些64位计算机)。 在一些奇怪的架构上,它甚至可能是36位。 int32_t val = 4; fwrite((const void *)val, 4, 1, fp) int32_t val = 4; fwrite((const void *)val, 4, 1, fp)应该解决问题。

您可能认为您的软件永远不需要移植。 好吧 – 许多设计师(软件和硬件)做出了类似的假设。 有时候制作它们成本太高 – 但在这种情况下,只需要进行少量额外检查。

  fclose(fp); return 0; } 

我也遇到过这种问题。 所以这是我的解决方案。

fwrite(val, sizeof(val[0], sizeof(val)/sizeof(val[0]), fp);

显然,我正试图访问0x0000004或类似的数据。

 int val = 4 

有问题。 fwrite旨在使用字符串,因此它的第一个输入是一个指针,一个字符串在内存中的位置。 你直接传递val的值(4)而不是val的地址到fwrite ; 但是,0x00000004处的存储器不是有效的程序存储器,因此给出了错误。

要解决此问题,请更改此设置:

 fwrite((const void*)val,sizeof(int),1,fp); 

进入这个:

 fwrite((const void*)&val, sizeof(int), 1, fp); 

“&”运算符表示val的位置。 这将是内存中的有效地址。