在C ++中,有一个std::fwrite()
将缓冲区写入磁盘上的文件。
如果fwrite实现中有任何缓冲区,请告诉我吗?
即。如果我多次调用fwrite()(比如说10次),它实际上是否会调用10次不同的文件I / O?
我问Ubuntu 10.04环境。
答案 0 :(得分:11)
是的,它是缓冲的。缓冲区的大小由BUFSIZ
定义。 (谢谢@ladenedge。)十个足够大的操作将导致十次系统调用。
您还可以使用std::setbuf
和std::setvbuf
设置自己的缓冲区。
cstdio
中的函数继承自C语言.C ++中的首选接口是fstream
和filebuf
。
答案 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没有可移植的方法。 (而且你常常不想这样做)