为什么printf在调用后不刷新,除非格式字符串中有换行符?这是POSIX行为吗?如何让printf每次都立即刷新?


当前回答

注意:Microsoft运行时库不支持行缓冲,因此printf(“将立即打印到终端”):

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setvbuf

其他回答

立即刷新调用fflush(stdout)或fflush(NULL) (NULL表示刷新所有内容)。

注意:Microsoft运行时库不支持行缓冲,因此printf(“将立即打印到终端”):

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setvbuf

这样做可能是为了提高效率,也因为如果有多个程序写入一个TTY,这样就不会让一行上的字符相互交错。所以如果程序A和B输出,你通常会得到:

program A output
program B output
program B output
program A output
program B output

这太糟糕了,但总比

proprogrgraam m AB  ououtputputt
prproogrgram amB A  ououtputtput
program B output

请注意,它甚至不保证在换行上刷新,因此如果刷新对您很重要,则应该显式刷新。

Stdout是缓冲的,因此只在打印换行符后输出。

要获得立即输出,可以:

打印到标准错误。 使stdout无缓冲。

你可以fprintf到stderr,这是无缓冲的。或者您可以在需要时刷新stdout。或者你可以将stdout设置为unbuffered。