2

我仍然认为自己是 CI 中的新 webby,我正在尝试读取文件,文件不是二进制文件,但它的大小从 feb kbs 的小尺寸到 feb Mbs 的大尺寸文件不等。我正在使用 fgets 函数,我已经参考从这个链接,但编译后,我得到分段错误。我尝试用 gdb 调试它,发现我能够打开文件但无法读取。这是我的代码。

    #include<stdio.h>
    #define MAX_LENGTH 1048576
    int main()
    {
    FILE *fp;
    char *result;
    char line[MAX_LENGTH];
    fp =fopen("/home/shailendra/sampleprograms/C/shail1.txt","r");
    if(result=fgets(line,MAX_LENGTH,fp) != NULL)
    printf("The string is %s \n",result);

    else
    printf("Error opening the file");

    if(fclose(fp))
    printf("fclose error");
    }

这个分段错误真的很吸你的血。我知道这是由于内存分配不足,但我使用了 MAX_LENGTH 1048576,所以我不认为它一定会产生任何问题。我已经尝试过只有一行的两个小文件和一个多行的大文件,但我无法弄清楚为什么会出现分段错误。

我也看了这个这个,但没有得到任何帮助。

4

2 回答 2

3

尝试一些括号:

if((result=fgets(line,MAX_LENGTH,fp)) != NULL)
   ^                                ^

如果没有这些,您将存储比较结果而不是指向字符串的指针。


旁注:你根本不需要result。成功时,fgets返回你传入的指针;换句话说,您可以 printf line

if(fgets(line, MAX_LENGTH, fp))
    printf("The string is %s \n", line);

第二个注意事项:在尝试从文件中获取 fgets 之前,您应该检查是否fopen成功:

if (!fp)
    perror("fopen");
于 2013-08-30T11:55:05.553 回答
0

除了 cnicutar 的回答之外,还有几件事:

#include <stdio.h>
        ^ Please make sure you have a space between your includes and the headers

fgets将读取直到遇到新行或 EOF(以先到者为准),因此要读取整个文件,您必须循环执行。

我建议这样做(不需要指出的指针分配):

while(fgets(line, MAX_LENGTH, fp))
    printf("%s", line);
于 2013-08-30T12:23:59.510 回答