【发布时间】:2015-11-18 09:01:17
【问题描述】:
我正在编写一些控制台程序,我注意到有时当我使用 print() 并且我的程序处于空闲状态时,并非所有内容都被打印出来(最后几行丢失了)。
最终会发生一些事情,并且确实会打印这些行,但通常当我关闭程序时,最后几行不存在。
所以我做了一些挖掘,看起来标准输出缓冲区并不总是清空,除非满足某些条件(换行?/换行?)。
所以我创建了一个“myprintf()”函数,它包装了 printf 以执行以下操作(在伪代码中):
printf(...);
fflush(stdout);
问题是,除了明显的额外函数调用开销之外,这是否会减慢我的程序速度? IE。这是一个糟糕的实践表现吗?
【问题讨论】:
-
通常,这个问题的答案是... 测量!顺便说一句,我猜如果你的程序没有长时间的计算(以秒为单位),那么刷新将占总工作的很大一部分,但你不会注意到它,因为它只是几个毫秒。
-
对于 C++,有许多与此主题相关的类似问题,关于使用
std::endl(添加换行符然后刷新输出)与'\n'或"\n"。查看stackoverflow.com/questions/8311058/… 或stackoverflow.com/questions/213907/c-stdendl-vs-n -
最简单的解决方法是始终以 '\n' 结束 printf() 格式字符串(结束输出行),因为这总是强制写入输出缓冲区(在操作系统中)。第二种方法是在提示用户输入时,在 printf() 之后的输入操作(如 scanf())将强制写入输出缓冲区(在 OS 中)。