I / O系统调用

时间:2014-01-30 18:15:53

标签: c file-io segmentation-fault system-calls

我正在本科课程中学习系统调用作为实验室的一部分。在我的操作系统实验室中,我开始反复尝试此错误,即使我无法在程序代码中找到任何错误。

终端输出

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);
}

任何人都可以帮我找到上述程序中的错误吗?

2 个答案:

答案 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。如果这两件事都被覆盖,那么我就不会发现它为什么会出现段错误的原因。