将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个字节。 在大多数现代它将是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
的位置。 这将是内存中的有效地址。