不,这不是POSIX行为,而是ISO行为(嗯,这是 POSIX行为,但仅在它们符合ISO的范围内)。
如果可以检测到标准输出是指交互式设备,则标准输出将被行缓冲,否则将被完全缓冲。因此,在某些情况下printf
即使刷新了换行符也不会刷新,例如:
myprog >myfile.txt
这对于提高效率很有意义,因为如果您与用户互动,他们可能希望查看每一行。如果将输出发送到文件,则很可能另一端没有用户(尽管并非没有可能,他们可能会拖尾文件)。现在你可以争辩说用户希望看到每个字符,但这有两个问题。
首先是效率不是很高。第二个原因是,最初的ANSI C指令主要是为了整理现有行为,而不是发明新行为,而这些设计决策是在ANSI开始该过程之前就做出的。更改标准中的现有规则时,即使今天的ISO也要非常谨慎。
至于如何处理,如果你 fflush (stdout)
在每个输出调用之后立即看到,那将解决问题。
另外,您可以setvbuf
在上进行操作之前使用stdout
,将其设置为无缓冲,而不必担心将所有这些fflush
行添加到代码中:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
只要记住这可能会影响性能相当多,如果你正在发送输出到文件。还要记住,对此的支持是实现定义的,标准并不能保证。
ISO C99部分7.19.3/3
是相关位:
当流没有缓冲时,应尽快从源或目的地出现字符。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。
当流被完全缓冲时,打算在填充缓冲区时将字符作为块与主机环境进行传输。
当流被行缓冲时,当遇到换行符时,字符打算作为块与主机环境进行传输。
此外,当填充缓冲区,在无缓冲流上请求输入或在需要从主机环境传输字符的行缓冲流上请求输入时,打算将字符作为块传输到主机环境。 。
对这些特性的支持是实现定义的,并且可能会受到setbuf
和setvbuf
功能的影响。