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

时间:2018-11-07 01:46:31

标签: 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文件中的所有行,但最后一行将打印两次。如何防止它两次打印?

1 个答案:

答案 0 :(得分:1)

您需要将循环更改为:

while ( fgets(string, 30, file) != NULL ) {
    printf("%s", string);
}

fgets()将失败,并在NULL变为真之前返回feof(file),并且不会更新string。因此,现在您成功在最后一行成功调用fgets(),将其打印,未成功调用fgets(),再次打印最后一行,然后终止循环。

这里要理解的关键是,只有在尝试从文件中读取并且读取失败时,您才知道自己位于文件末尾。从那以后,有人可能会将数据自上次读取以来附加到文件的末尾。例如,