我正在本科课程中学习系统调用作为实验室的一部分。在我的操作系统实验室中,我开始反复尝试此错误,即使我无法在程序代码中找到任何错误。
bharaths-mbp:sem4 bharathdustan$ vim readFromFile.c
bharaths-mbp:sem4 bharathdustan$ gcc readFromFile.c
bharaths-mbp:sem4 bharathdustan$ ./a.out
Segmentation fault: 11
我收到此错误的代码是:
#include<stdio.h>
int main()
{
char str[100];
FILE *fp;
fp=fopen("file1.dat","r");
while(!feof(fp))
{
fscanf(fp,"%s",str);
printf(" %s ",str);
}
fclose(fp);
}
任何人都可以帮我找到上述程序中的错误吗?
答案 0 :(得分:1)
1)检查fopen()
fp = fopen("file1.dat", "r");
if (fp == NULL) Handle_FileOpenError();
2)阅读后需要检查fscanf()
或feof()
的结果。在没有结果的读取之后,feof()
才会返回true。原始代码检查feof()
太晚了。
while(fscanf(fp,"%s",str) != EOF) {
printf(" %s ",str);
}
3)正如@Rohan建议的那样,确保您没有过度填充str
while(fscanf(fp,"%99s",str) != EOF) {
printf(" %s ",str);
}
答案 1 :(得分:0)
您的代码没有任何语义错误,它不是非常安全或灵活。如果找不到该文件(确保它在同一目录中),则可能会出现段错误,如果您读入的字符串大于分配的内存,则可能是segfalut。如果这两件事都被覆盖,那么我就不会发现它为什么会出现段错误的原因。