【发布时间】:2010-12-15 12:51:57
【问题描述】:
为什么printf 在调用后不刷新,除非换行符在格式字符串中?这是 POSIX 行为吗?我怎么可能让printf 每次都立即刷新?
【问题讨论】:
-
您是否调查过这种情况是发生在任何文件上还是仅在终端上?这听起来是一个聪明的终端功能,它不会从后台程序输出未完成的行,尽管我希望它不适用于 前台程序。
-
在 Cygwin bash 下,即使换行符 is 在格式字符串中,我也会看到同样的错误行为。这个问题是 Windows 7 的新问题;相同的源代码在 Windows XP 上运行良好。 MS cmd.exe 按预期刷新。修复
setvbuf(stdout, (char*)NULL, _IONBF, 0)可以解决这个问题,但肯定没有必要。我正在使用 MSVC++ 2008 Express。 ~~~ -
为了澄清问题的标题:
printf(..)本身不进行任何刷新,当看到换行符时,stdout的缓冲可能会刷新(如果是行缓冲)。它会对putchar('\n');做出同样的反应,所以printf(..)在这方面并不特殊。这与cout << endl;形成对比,documentation of which 突出地提到了冲洗。 documentation of printf 根本没有提到冲洗。 -
写入 (/flushing) 可能是一项昂贵的操作,它可能出于性能原因而被缓冲。
-
@EvgeniSergeev:是否有共识认为该问题错误地诊断了问题,并且当 输出 中有换行符时会发生刷新? (在格式字符串中放置一个是在输出中获取一个的一种方式,但不是唯一的方式)。