我是C的初学者。当我使用它时循环打印文件的包含。最后一行将在 Linux 上打印两次。当到达文件末尾时,它不应该进入 while 循环。它在窗户上没有问题。
#include <stdio.h>
#include <unistd.h>
int main()
{
char string[400];
FILE *file_para;
// Open the file
if ((file_para = fopen("Test.txt", "r")) == NULL)
{
printf("cannot open filen");
getchar();
return 0;
}
while (!feof(file_para))
{
fgets(string, 400, file_para);
printf("**** %s", string);
}
fclose(file_para);
getchar();
return 0;
}
使用feof()
的错误方式。 使用 feof()
检测其中一个主要 I/O 功能失败后出现的问题。 它不能预测您是否即将达到 EOF;它告诉您某些 I/O 函数何时已报告 EOF。 C 不是帕斯卡;在 Pascal 中,您可以(必须?)在调用 I/O 函数之前检查 EOF。
while (fgets(string, sizeof(string), file_para) != 0)
{
...do printing, etc...
}
// If you need to, use `feof()` and `ferror()` to sort out what went wrong.
如果你真的,真的坚持使用feof()
,那么你还需要检查你的I/O操作:
while (!feof(file_para))
{
if (fgets(string, sizeof(string), file_para) == 0)
break;
...do printing, etc...
}
请注意,您可能会失败,因为即使ferror(file_para)
没有,feof(file_para)
的评估结果也会为 true...所以也许你需要while (!feof(file_para) && !ferror(file_para))
,但这实际上只是更多的证据,证明while
循环应该以I/O功能为条件,而不是feof()
。
这是一个常见的反模式:
while (!feof(file_para))
{
fgets(string, 400, file_para);
feof()
不会检测下一个输入调用是否会由于文件末尾而失败;它会告诉您文件是否已到达文件末尾。 您应该仅在输入函数已经失败后调用它,以查看它失败的原因(可能是错误或文件结尾)。
正确的模式是:
while (fgets(string, 400, file_para))
{