11

我在 Windows 下有一个很好的旧 C FILE 文件描述符,输出流使用它来写入数据。我的问题很简单,但我找不到答案:

假设我不调用 fflush,内容何时刷新到光盘?

流不断接收数据,并且似乎经常刷新内容,但是刷新它的规则是什么?

4

1 回答 1

15

如果库实现可以确定输出流不引用交互式设备(并且在那时),则流将被完全缓冲,即当缓冲区(默认BUFSIZ大小)已满时将被刷新。

'\n'如果没有完全缓冲,流可以是行缓冲的,即在写入时(或缓冲区已满,如果您的行真的很长)或无缓冲时,它将被刷新。

(ISO/IEC 9899:1999,第 7.19.5.3 章“fopen()功能”,第 7 段。手头没有更新版本的标准,但 AFAIK 这并没有改变。)

构成“交互式设备”的内容是实现定义的。(第 5.1.2.3 章“程序执行”,第 6 段。)

一般的想法是文件输出应该是完全缓冲的,而终端输出应该是行缓冲的(或无缓冲的,正如 Jesse Good 正确指出的那样)。

缓冲策略和缓冲区大小都可以通过setvbuf(). 请注意,任何此类更改都必须在您开始访问流之前发生,一旦您考虑一下,这一点就很明显了。

于 2013-04-23T07:14:56.873 回答