c - 缓冲区刷新不适用于 printf 函数

标签 c fflush

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

最佳答案

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

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

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

dotting | more

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

关于c - 缓冲区刷新不适用于 printf 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538822/

相关文章:

调整窗口大小后无法正确检索鼠标坐标

c++ - 由于段错误,我的程序在 fflush 上崩溃,...但并非总是如此?

linux - 非交互中的 awk 遗漏了一些数据

C 程序不会打印行,已尝试刷新

动态调用带有 varargs 参数的 C 函数

c - 链表-编译错误含义

C 接口(interface)和实现 : why there are both function assert and macro assert?

c++ - C 中用 1 替换 0 的宏

c - 在等待通过scanf()输入之前,没有通过SSH的输出

bash - 在 bash 中,如何强制刷新打印到终端的不完整行