fprintf
当使用或写入文件时,我找不到任何关于缓冲是否已经隐式完成的信息fwrite
。我知道这可能是实现/平台相关的功能。我感兴趣的是,我是否至少可以期望它在现代流行平台(如 Windows、Linux 或 Mac OS X)上有效实现?
AFAIK,通常 I/O 例程的缓冲在 2 个级别上完成:
- 库级别:可以是 C 标准库,也可以是 Java SDK (
BufferedOutputStream
) 等; - 操作系统级别:现代平台广泛缓存/缓冲 I/O 操作。
我的问题是关于#1,而不是#2(我知道这已经是真的了)。换句话说,我可以期望所有现代平台的 C 标准库实现都能利用缓冲吗?
如果不是,那么手动创建一个缓冲区(巧妙地选择大小)并在溢出时刷新它是解决问题的好方法吗?
结论
感谢所有指出 和 之类的功能的setbuf
人setvbuf
。这些是我正在寻找回答我的问题的确切证据。有用的提取物:
如果已知所有文件不引用交互式设备,则所有文件都使用默认分配的缓冲区(完全缓冲)打开。此函数可用于设置特定内存块用作缓冲区或禁用流的缓冲。
默认情况下,默认流
stdin
和stdout
完全缓冲,如果已知它们不引用交互式设备。否则,它们可能默认为行缓冲或非缓冲,具体取决于系统和库实现。也是如此stderr
,默认情况下总是行缓冲或无缓冲。