fwrite缓冲输出吗?

时间:2010-05-10 20:12:25

标签: c++

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

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

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

我问Ubuntu 10.04环境。

5 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

这取决于库的实现。您可以查看 dtruss strace 等内容,以查看实现实际调用的系统调用。

你为什么关心这个?

答案 4 :(得分:0)

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