从文件中使用fgets读取内容

16

我正在读取格式为

1 32 43 23
32 43
123 43 54 243 
123 2222
2

这是我的代码片段。

string[100];
while(!feof(fp))
    fgets(string,100,fp)

现在,当我把每个字符串放在最后一个字符串中时,我会得到重复和一些更多的模糊不清(比如说会打印出123或其他东西)。

如何解决这个问题?


你的文件最后一行有没有换行符\n - Sergey Kalinichenko
2
请发布您的完整实际代码,这甚至不能编译。 - Staven
2个回答

27
你需要检查 fgets 的返回值。如果读取成功,fgets 会返回你传递给它的缓冲区指针(例如你的示例中的 string)。如果遇到文件结尾且没有读取任何字符,fgets 将返回 NULL

试试这个:

char string[100];
while(fgets(string, 100, fp)) {
    printf("%s\n", string);
}

1
如果fgets已经测试了,为什么还要使用feof进行测试? - Manuel Reis
2
@ManuelReis 你是对的,feof测试是不必要的(已编辑)。 - Sergey Kalinichenko
4
谢谢您的回答,我曾经有一瞬间经历了存在危机。 - Manuel Reis
2
printf 中的 \n 是不必要的,因为它已经通过 fgets() 从文件中获取(如果存在)。 - alk
假设fgets()的返回值为0,这段代码可以正常工作。通常NULL并不一定是0,它通常是(void*)0。如果你使用NULL进行检查,代码会更易读。 - overexchange

7
< p > 当你尝试从已经到达结尾的文件中进行读取时,才会遇到eof。你需要使用fgets的返回值(当到达eof或出现错误时返回NULL,否则返回所给指针),而不是检查eof

char string[100];
while(fgets(string, 100, fp))
    // do stuff with string

检查返回值的方式会导致你永远无法进入循环体内部的eof,而是在条件中触发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接