我打开二进制文件时出现分段错误

时间:2015-04-12 09:36:43

标签: c

我对C不是很擅长,但我以前从未见过这样的事。

我有一个二进制文件file.bin,它有一个long整数,后面跟着很多double个实数。所以我写了以下内容:

#include <stdio.h>

int main(void) {
    char filename[1000];
    sprintf(filename, "~/file.bin");
    FILE *fp;
    long i;
    double x;

    fp=fopen(filename,"rb");

    fread(&i,sizeof(long),1,fp);

    printf("%ld\n",i);

    for (i=0;i<20;i++){
        fread(&x,sizeof(double),1,fp);
        printf("%le\n",x);
    }

    fclose(fp);
    return 0;
}

分段违规发生在fread(&i,sizeof(long),1,fp);之前我以这种方式编写了类似的代码并且它们都运行良好,但事实并非如此。

提前感谢您的回答。

仅供参考,我在linux服务器上使用gcc 3.4.6。

1 个答案:

答案 0 :(得分:1)

你确定文件存在且fp不是NULL吗?!!!

我尝试了你的代码,如果文件存在,它也会在文件不包含数据的情况下运行。

我建议你在文件打开后插入一个控件:

fp=fopen(filename,"rb");
if (fp==NULL) {
    perror("Error ");
    return errno;
}

如果您使用errno,请记住包括errno.h!

#include <errno.h>

这个补丁只解决了由于fp的NULL分配引起的错误,但如果你读到超出结尾(和其他情况),你应该更好地考虑fread()函数返回的错误。请参阅fread规范:http://www.cplusplus.com/reference/cstdio/fread/