【问题标题】:Buffer flushing not working for printf function缓冲区刷新不适用于 printf 功能
【发布时间】:2019-04-05 15:27:52
【问题描述】:

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

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

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

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

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

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

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

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

更多数据:

  • Ubuntu Linux v16 作为操作系统。
  • Code::Blocks 作为 IDE。
  • 只有在 Bash 命令行上运行时才会出现问题。在 IDE 中工作正常。
  • 在 Ubuntu Linux(与运行 IDE 相同)和 FreeBSD(通过与 clang 交叉编译)上测试。

【问题讨论】:

  • 试试sleep(1); fflush(stdout); --> fflush(stdout);sleep(1); 如果这没有帮助,我怀疑你的编译器不兼容。
  • 你为什么要强调随机词?
  • “已测试”和“已测试”有什么区别?
  • @chux 我认为它不是编译器,而是 IDE 控制台。 Eclipse 多年来一直存在这些问题。
  • 添加@EugeneSh。恕我直言,IDE 尝试通过仅管理行而不是字符来优化其控制台输出。

标签: c fflush


【解决方案1】:

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

问题是:在命令行测试中,我附加了一些| more 以阻止屏幕转储。所以stdout 缓冲区被管道| 命令改变了。

假设我的程序二进制文件名为dotting。我通过键入来调用它:

dotting | more

我希望这个荒谬的案例可以在未来对任何人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多