使用fgets读取文件并在屏幕上打印其内容

时间:2013-08-30 11:53:53

标签: c file-io segmentation-fault

我仍然认为自己是CI中的一个新的webby我试图读取文件,文件不是二进制,但它的大小从feb kbs的小尺寸到feb Mbs的大尺寸文件。我正在使用fgets功能,我已经花了reference from this link但是在编译之后,我得到了分段fault.i试图用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,所以我不认为它必须造成任何问题。我曾用两个小文件试过它只有一行和一个有多行的大文件,但我无法弄清楚为什么我会出现分段错误。

我也看了thisthis但没有得到任何帮助。

2 个答案:

答案 0 :(得分:3)

尝试一些括号:

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

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


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

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

第二方注意:在尝试从文件fgets之前,您应该检查fopen是否成功:

if (!fp)
    perror("fopen");

答案 1 :(得分: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);