从文件中读取字符串后打印未知字符

时间:2012-05-05 19:23:22

标签: c

我有一个从文件中读取的功能:

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个字符串后,我得到分段错误。

3 个答案:

答案 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';

应该没问题。)