我有一个从文件中读取的功能:
void input(char* buffer, FILE* fp)
{
char temp[100];
fgets(temp,100,fp);
strcpy(buffer,temp);
buffer [strlen(buffer)-1]=0;
}
我提交:
1
2
3
4
5
最后一行以换行符结束。
我尝试以这种方式阅读文件:
FILE* fp=fopen("myfile.txt","r");
while(!feof(fp))
{
char buffer[100];
input(buffer,fp);
puts(buffer);
}
它成功读取所有五个字符串:“1”,“2”,“3”,“4”,“5”并打印它们,但在打印完第5个字符串后,我得到分段错误。
答案 0 :(得分:4)
这是C(以及其他语言)中常见的反模式,可以设置像您这样检查!feof(fp)
的循环。问题是,在读取因EOF失败后,此函数仅返回。问题是您在检查读取是否成功之前使用了读取的结果。
我建议您检查fgets()
的返回值,如果有EOF,它将返回NULL
。传播该值并将其从input()
函数返回。然后在循环条件中使用它。
只需补充一下,seg故障本身可能就在你strcpy()
的电话中。当fgets()
失败时,您尝试复制未初始化数据的缓冲区,其中可能包含任何内容,strcpy()
可能会找到比缓冲区长得多的“字符串”。即使它碰巧找到了更短的东西,你的结果仍然是垃圾。
答案 1 :(得分:1)
看起来像
buffer [strlen(buffer)-1]=0;
在最后一个空白行,strlen为0,缓冲区设置在其范围之外。
答案 2 :(得分:-2)
表示字符串结尾的字符不是'0'而是'\ 0'所以替换这一行:
buffer [strlen(buffer)-1]=0;
通过
buffer [strlen(buffer)-1]='\0';
应该没问题。)