繁体   English   中英

fwrite缓冲输出吗?

[英]Does fwrite buffer the output?

在C ++中,有一个std::fwrite() ,它将缓冲区写入磁盘上的文件。

如果fwrite实现中有任何缓冲区,你能告诉我吗?

即如果我多次调用fwrite()(比如说10次),它实际上是否会调用10次不同的文件I / O?

我问Ubuntu 10.04环境。

是的,它是缓冲的。 缓冲区的大小由BUFSIZ定义。 (谢谢@ladenedge。)十个足够大的操作将导致十次系统调用。

您还可以使用std::setbufstd::setvbuf设置自己的缓冲区。

cstdio中的函数继承自C语言.C ++中的首选接口是fstreamfilebuf

这取决于。 在大多数平台上,文件IO被缓存,因此存在将缓存数据写入磁盘的fflush()调用 - 在这方面,您的第一个问题的答案是(通常)“是”,而您的第二个问题是“否”。 也就是说,任何特定平台的任何想象力都不能保证这种方式 - 通常,标准只规定了这些功能的接口,而不是它们的实现。 此外,如果缓存变为“满”,调用fwrite()很可能会导致隐式刷新,在这种情况下,调用fwrite()实际上可能会触发文件IO - 尤其是在调用具有大量数据的fwrite()时。

FILE* I / O可以缓冲,但不一定是(每个流可以不同)。 此外,有多种方法可以进行缓冲(完全缓冲,其中缓冲区未被刷新,直到它已满或显式调用fflush或行缓冲,其中缓冲区未被刷新,直到它看到EOL)。 也可以完全关闭缓冲。

您可以使用setvbuf调用更改缓冲类型。

这取决于库的实现。 您可以查看dtrussstrace之类的内容,以查看实现实际调用的系统调用。

你为什么关心这个?

我不相信标准说明了这一点,但总的来说:操作系统不会决定要做多少I / O操作。 如果数据大小很大,它可能是1甚至可能是10。 大多数操作系统允许您控制I / o的行为方式,但AFAIK没有可移植的方法。 (通常你不想要)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM