【发布时间】:2023-02-10 19:27:58
【问题描述】:
为什么 printf 在调用后不刷新,除非换行符在格式字符串中?这是 POSIX 行为吗?我怎么可能让 printf 每次都立即刷新?
【问题讨论】:
-
您是否调查过这种情况是发生在任何文件上还是仅发生在终端上?这听起来是一个聪明的终端功能,不从后台程序输出未完成的行,但我希望它不适用于这前台程序。
-
在 Cygwin bash 下,即使是换行符,我也会看到同样的不当行为是在格式字符串中。这个问题是 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:是否一致认为问题诊断错误,并且当换行符时发生刷新输出? (将一个放在格式字符串中是一种方法,但不是在输出中获取一个的唯一方法)。