我是C的初学者。当我使用while循环打印文件的包含时。最后一行将在Linux上打印两次。当到达文件末尾时,它不应该进入while循环。它在Windows上没有问题。
#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 file\n");
getchar();
return 0;
}
while (!feof(file_para))
{
fgets(string, 400, file_para);
printf("**** %s", string);
}
fclose(file_para);
getchar();
return 0;
}
答案 0 :(得分:1)
这是一种常见的反模式:
while (!feof(file_para))
{
fgets(string, 400, file_para);
feof()
未检测到 next 输入调用是否会因文件结尾而失败;它告诉您文件是否已到达文件结尾。你应该只在输入函数失败后才调用,看看它失败的原因(可能是错误或文件结束)。
正确的模式是:
while (fgets(string, 400, file_para))
{
答案 1 :(得分:1)
这是使用feof()
的错误方法。使用feof()
检测其中一个主I / O功能失败后出现的问题。它无法预测你是否即将达到EOF;它会告诉您某些I / O功能何时报告了EOF。 C不是Pascal;在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)
评估为true,即使feof(file_para)
没有...所以也许您需要while (!feof(file_para) && !ferror(file_para))
,但这确实只是while
的证据{1}}循环应以I / O函数为条件,而不是feof()
。