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