我在 Windows 下有一个很好的旧 C FILE 文件描述符,输出流使用它来写入数据。我的问题很简单,但我找不到答案:
假设我不调用 fflush,内容何时刷新到光盘?
流不断接收数据,并且似乎经常刷新内容,但是刷新它的规则是什么?
如果库实现可以确定输出流不引用交互式设备(并且仅在那时),则流将被完全缓冲,即当缓冲区(默认BUFSIZ
大小)已满时将被刷新。
'\n'
如果没有完全缓冲,流可以是行缓冲的,即在写入时(或缓冲区已满,如果您的行真的很长)或无缓冲时,它将被刷新。
(ISO/IEC 9899:1999,第 7.19.5.3 章“fopen()
功能”,第 7 段。手头没有更新版本的标准,但 AFAIK 这并没有改变。)
构成“交互式设备”的内容是实现定义的。(第 5.1.2.3 章“程序执行”,第 6 段。)
一般的想法是文件输出应该是完全缓冲的,而终端输出应该是行缓冲的(或无缓冲的,正如 Jesse Good 正确指出的那样)。
缓冲策略和缓冲区大小都可以通过setvbuf()
. 请注意,任何此类更改都必须在您开始访问流之前发生,一旦您考虑一下,这一点就很明显了。