缓冲区刷新不适用于printf功能

时间:2019-04-05 15:27:53

标签: c fflush

  

来自这里:https://stackoverflow.com/a/1716621/1461017

我想在for循环的控制下,在同一行上一次打印单独的点(点,“。”):

for (i=0; i<100; i++)
{
    printf(".");
    sleep(1);
}
printf("\n");

但是输出仅在最后一个“ \ n”之后才显示在屏幕上,我希望每个人在打印后立即显示它们,以便用作进度指示器。我希望fflush()在每次循环迭代中使用标准输出都会产生该结果,但这不起作用(结果仅在执行for循环后显示在屏幕上):

for (i=0; i<100; i++)
{
    printf(".");
    sleep(1);
    fflush(stdout);
}
printf("\n");

我进一步测试了所有这些方法,无论是循环内还是循环外,都没有成功:

fflush(stdout);
fflush(NULL);
setbuf(stdout,NULL);

这是怎么回事,我该如何解决?

其他数据:

  • Ubuntu Linux v16作为操作系统。
  • 代码::块作为IDE。
  • 仅在Bash 命令行上运行时才会出现问题。在IDE中可以正常工作。
  • 在Ubuntu Linux (运行IDE的相同版本)和 FreeBSD (通过使用clang进行交叉编译)上进行了测试。

1 个答案:

答案 0 :(得分:0)

嗯...一个愚蠢的问题,但我想还是应该把它写下来,因为有人也可以把它写下来:

问题是:在命令行测试中,我追加了一些| more以停止屏幕转储。因此stdout缓冲区已通过管道|命令进行了更改。

说我的程序二进制文件名为dotting。我通过键入以下内容来调用它:

dotting | more

我希望这个荒谬的案例将来能对任何人有所帮助。