我对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。
答案 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/