我仍然认为自己是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,所以我不认为它必须造成任何问题。我曾用两个小文件试过它只有一行和一个有多行的大文件,但我无法弄清楚为什么我会出现分段错误。
答案 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);