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

时间:2009-04-21 11:19:28

标签: c file binary int

我需要使用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或类似的数据。

谢谢!

6 个答案:

答案 0 :(得分:24)

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

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

两项改进:

  • 没有指针转换,因为在C中没有必要并且可以隐藏错误。
  • 直接在对象上使用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);

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

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

  1. 不同计算机上的字节顺序可能不同(如上所述)
  2. 尺寸可能不同。在真正的旧计算机上,它可能是1或2个字节。在大多数现代它将是4但它可能也是8(一些64位计算机)。在一些奇怪的架构上,它甚至可能是36位。 int32_t val = 4; fwrite((const void *)val, 4, 1, fp)应解决问题。
  3. 您可能认为您的软件永远不需要移植。好吧 - 许多设计师(软件和硬件)做出了类似的假设。有时候制作它们成本太高 - 但在这种情况下,这只是一些额外的检查。

        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的位置。这将是内存中的有效地址。