C++中的Fgets重复最后一行

Gar*_*iel 1 c++ file fgets

我有程序喜欢(来自链接文字)

FILE* soubor;
char buffer[100];
soubor = fopen("file","r");
string outp = "";
while (! feof(soubor))
{
        fgets(buffer,100,soubor);
        fputs (buffer , stdout);
}
fclose(soubor);
Run Code Online (Sandbox Code Playgroud)

和文件一样

A
B
C
D
E
Run Code Online (Sandbox Code Playgroud)

程序的输出是

A
B
C
D
E
E
Run Code Online (Sandbox Code Playgroud)

它重复两次文件的最后一行.我在其他程序中也有这个问题.

Ben*_*ell 7

问题是,对于最后一行,fgets将失败.但是,在下一个循环之前,您不会检查feof,因此您仍然会调用fputs来打印缓冲区的内容,即前一行.

试试这个:

FILE* soubor;
char buffer[100];
soubor = fopen("file","r");
string outp = "";
while (true)
{
  fgets(buffer,100,soubor);
  if (feof(soubor))
    break;
  fputs (buffer , stdout);
}
fclose(soubor);
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 7

使用feof()循环从条件读取的条件几乎总是会导致问题.标准方式如下所示:

while (fgets(buffer, 100, infile))
    fputs(buffer, stdout);
Run Code Online (Sandbox Code Playgroud)