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

Geo*_*Geo 3 c binary int file

我需要使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢 !

unw*_*ind 25

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

fwrite(&val, sizeof val, 1, fp);
Run Code Online (Sandbox Code Playgroud)

两项改进:

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

  • fwrite()期望将void*作为其第一个参数.任何指针类型都可以在没有强制转换的情况下使用void*.void*有效地说"我需要一个指针,我不关心它指向什么类型". (7认同)

小智 16

 fwrite((const void*)val,sizeof(int),1,fp);
Run Code Online (Sandbox Code Playgroud)

应该:

 fwrite((const void*) & val,sizeof(int),1,fp);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你不使用强制转换,你会得到一个明智的错误信息.C(和C++)程序员经常使用强制转换程序,这是一个很好的经验法则,"如果它需要演员,那可能是错误的".


dir*_*tly 5

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