C 文本文件的最后一行打印两次

C 文本文件的最后一行打印两次,c,file-io,C,File Io,假设FILE_NAME是一个全局常量 如果我有以下代码 FILE *file; file = fopen(FILE_NAME, "r"); char string[30]; do { fgets(string, 30, file); printf("%s", string); } while ( !feof(file) ); 它打印txt文件中的所有行,但最后一行打印两次。如何防止打印两次?您需要将循环更改为: while ( fgets(string, 30, file) !

假设FILE_NAME是一个全局常量

如果我有以下代码

FILE *file;
file = fopen(FILE_NAME, "r");
char string[30];
do
{
    fgets(string, 30, file);
    printf("%s", string);
}
while ( !feof(file) );

它打印txt文件中的所有行,但最后一行打印两次。如何防止打印两次?

您需要将循环更改为:

while ( fgets(string, 30, file) != NULL ) {
    printf("%s", string);
}
fgets()
将失败并在
feof(file)
变为真之前返回
NULL
,并且它不会更新
string
。因此,现在您正在最后一行成功调用
fgets()
,打印它,调用
fgets()
失败,再次打印最后一行,然后终止循环

这里要理解的关键是,只有当您尝试读取文件但读取失败时,才知道您位于文件的末尾。在此之前,例如,据您所知,自上次读取文件以来,可能有人在文件末尾追加了数据