【发布时间】:2021-07-22 12:53:38
【问题描述】:
我知道fflush(stdin) 根据标准这是未定义的行为。但是对于stdout,就没有这个限制了。我google了一下,得到了使用stdout作为fflush的参数的概念,但是我没弄明白。
有人可以用一个简单的例子详细说明以stdout 为参数的fflush 函数吗?
【问题讨论】:
我知道fflush(stdin) 根据标准这是未定义的行为。但是对于stdout,就没有这个限制了。我google了一下,得到了使用stdout作为fflush的参数的概念,但是我没弄明白。
有人可以用一个简单的例子详细说明以stdout 为参数的fflush 函数吗?
【问题讨论】:
打印时(例如printf),输出会被放入缓冲区,并且在显示换行符之前可能不会写入控制台。为确保缓冲区中的所有内容都写入控制台,可以使用fflush(stdout)。
一个例子是显示某个进程的进度:
for(int i = 0; i < 100; i++)
{
<...calculation...>
printf("."); // Print a dot after each iteration to show progress
fflush(stdout); // The dot may be buffered. This ensures that it is displayed immediately
}
【讨论】:
stdout 被行缓冲以将输出插入缓冲区并且在遇到换行符之前不写入屏幕的情况并不少见。因此,printf(".") 是否导致立即打印一个点取决于系统。刷新stdout 以可能的性能损失为代价确保一致的行为。