C 当printf可以自己打印时,为什么要在printf之后使用fflush?

C 当printf可以自己打印时,为什么要在printf之后使用fflush?,c,flush,stdio,fflush,C,Flush,Stdio,Fflush,我是C新手,如果我的问题太简单,我很抱歉。我经常看到这样的代码: printf("%d", counter); fflush(stdout); 我的猜测是,如果缓冲区未满,它将不会打印输出,因此需要刷新stdout。但是我试着不使用flush,只使用printf,我仍然在屏幕上打印出来,那么使用flush有什么意义呢?在printf之后使用flush的主要原因是计时 printf将在某个时间点显示信息。基本上,printf的所有打印都是缓冲的fflush保证缓冲区是空的,这

我是C新手,如果我的问题太简单,我很抱歉。我经常看到这样的代码:

printf("%d", counter);
fflush(stdout);

我的猜测是,如果缓冲区未满,它将不会打印输出,因此需要刷新
stdout
。但是我试着不使用
flush
,只使用
printf
,我仍然在屏幕上打印出来,那么使用
flush
有什么意义呢?

printf
之后使用
flush
的主要原因是计时

printf
将在某个时间点显示信息。基本上,
printf
的所有打印都是缓冲的
fflush
保证缓冲区是空的,这意味着打印发生在调用
fflush
的代码行

在容易崩溃的程序中,
fflush
是一个非常有用的工具。程序用户希望接收的消息通常是崩溃前打印的最后一条消息。如果程序没有
fflush
,则用户可能无法获得最后一条打印语句,该语句在显示前会丢失在缓冲区中


这通常会导致开发人员在崩溃后分析日志文件时,在程序源代码的错误位置查找错误。心理过程是“好吧,它不可能在这里出现,因为有一个
printf
我们会看到的”,当现实是程序通过了“本来会看到”的
printf
语句,但在缓冲区中随着该消息而死亡。如果在打印语句后立即刷新语句,则不会发生这种情况(尽管程序运行较慢,因为刷新需要时间)。

此代码后程序是否立即退出?打开的句柄在关闭时(包括程序退出时)全部刷新,并显示输出<代码>fflush在程序不会很快退出时很重要,您现在可能需要屏幕上的输出,例如显示倒计时(您可以使用
\r
反复擦除并打印以进行更新),或者确保数据发送到并行进程所依赖的管道(特别是当您要等待对所述数据的响应时;如果您在未刷新的情况下进行阻止,则它不会看到数据,也不会响应,并且您处于死锁状态)。我试着在过马路之前不要看两边,效果很好,那么为什么人们在过马路之前要看两边呢?@dukeforever:这跟什么有关系吗?OP使用的是
stdout
,它既不是输入,也不是更新流,它是纯输出。你的逻辑缓慢中有一个微妙的错误;or、 可能只是你的措辞中的一个错误。你认为缓冲区只有在满的时候才会被刷新。这不是完全正确的。是的,满的缓冲区会触发刷新;但是,它不是唯一会触发刷新的东西。缓冲区中的时间更长,以及大量的空闲计算/io容量也会导致缓冲区被刷新,即使缓冲区已满ren未满。@slowjams除了
fflush
之外,没有任何东西可以保证触发缓冲区刷新。其他任何东西都可能触发缓冲区刷新;但是,没有任何保证。某些流在写入时自动刷新(在某些语言中)。通常,这些是您的错误流,而不是典型的输出流;但是,您需要查阅语言文档以确保它是可靠的。编辑可能还值得注意的是,默认情况下,
stderr
没有缓冲。因此,所描述的问题只存在于
stdout
中,而不存在于
stderr
中。