我需要使用C的I / O函数将数据写入二进制文件。以下代码导致运行时异常:
#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或类似的数据。
谢谢!
答案 0 :(得分:24)
我认为尼尔的答案可以改进。我意识到它已被接受,所以这只是为了显示一些对比(这就是为什么我不只是编辑他的原因)。
fwrite(&val, sizeof val, 1, fp);
两项改进:
sizeof
,因为这是您传递指针的内容。对我来说很有意义,比重复自己和使用类型名称更安全。答案 1 :(得分:16)
fwrite((const void*)val,sizeof(int),1,fp);
应该是:
fwrite((const void*) & val,sizeof(int),1,fp);
顺便说一句,如果你不使用强制转换,你会得到一个明智的错误信息。 C(和C ++)程序员经常使用强制转换程序,这是一个很好的经验法则,“如果它需要演员,那可能就错了”。
答案 2 :(得分:5)
添加到Neil的答案:当您在同一平台上阅读和编写文件时,这是有效的。如果你在具有不同字节序的平台上阅读/写作,事情会变得很奇怪。
答案 3 :(得分:0)
#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);
你应该提供一个非整数的地址。
另外,你不应该以这种方式使用整数:
int32_t val = 4; fwrite((const void *)val, 4, 1, fp)
应解决问题。您可能认为您的软件永远不需要移植。好吧 - 许多设计师(软件和硬件)做出了类似的假设。有时候制作它们成本太高 - 但在这种情况下,这只是一些额外的检查。
fclose(fp);
return 0;
}
答案 4 :(得分:0)
我也遇到过这种问题。所以这是我的解决方案。
fwrite(val, sizeof(val[0], sizeof(val)/sizeof(val[0]), fp);
答案 5 :(得分:0)
显然,我正试图访问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
的位置。这将是内存中的有效地址。