【问题标题】:why does printf output normally without fflush为什么printf没有fflush正常输出
【发布时间】:2020-07-11 14:58:16
【问题描述】:

我了解到 stdout 是行缓冲的,并且在以下几种情况下会自动刷新缓冲区(1)当缓冲区已满时,(2)当打印一个 \n 字符并且输出到“终端”时(例如没有被重定向到文件),(3)当程序退出时,以及(4)当程序等待输入时。但是当我在没有 \n 的情况下使用 printf ,在 while 循环中没有 fflush 时,它在每次迭代中都能正常输出,我是否误解了 printf 或 fflush 的工作原理?代码是在windows上编译和运行的,我在ubuntu机器上试过同样的代码,效果很好,请问是windows终端的问题吗?

int main(){
    int a=10;  
    while(a--){
        printf("hello world");
        sleep(1);
    }
    return 0;
}

【问题讨论】:

  • “它工作正常”到底是什么意思?

标签: printf fflush


【解决方案1】:

根据 Posix,在 C 中,stdout 可能是行缓冲的,并且会受到您描述的最坏情况延迟的影响。没有要求必须如此。

许多编程语言都有一个名为“printf”的函数;你指的是哪个?看起来像您的示例中的 C。


我刚刚查看了一些 2011-ish 版本的 Visual Studio(我碰巧手头的最新版本)的 C 运行时库的 printf 的源代码,并且基于对代码的非常粗略的扫描(它相当复杂的所有预处理器条件化),我会说它在执行期间缓冲,然后在调用结束时刷新缓冲区,用于标准输出和标准错误。

如果你想编写可移植的代码,你不应该假设上述情况。为确保写入标准输出(没有行终止符)的数据变得可见,您应该显式刷新。

【讨论】:

  • 它是C,你是说windows上的stdout不是行缓冲的吗?否则我不知道如何解释我的代码的结果......
  • 我建议您在帖子中使用的“问题”一词不合适。行缓冲输出的效果是潜在地延迟输出的出现,但不能保证这种延迟,代码不应该依赖它。但是当我在 WIndows 上编程时,C RTL 源代码包含在 Visual Studio 安装中。你可以检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多