如何发现/控制 C++ fstream 中的内部缓冲级别?

And*_*ewR 4 c++ iostream ifstream

假设我这样做(一个人为的例子):

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream ifs(argv[1]);

    char ch;
    while(ifs.read(&ch, 1)) {
        cout << ch;
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设(希望)iostream 库在这里做了一些内部缓冲,并且不会将其变成操作系统级别的无数单字节文件读取操作。

有没有办法:

a)找出ifstream内部缓冲区的大小?

b)更改 ifstream 内部缓冲区的大小?

我正在编写一个文件过滤器,需要以小块的形式读取数千兆字节的文件,我想尝试不同的缓冲区大小,看看它是否会影响性能。

e.J*_*mes 5

您可以使用它ios::rdbuf()来获取指向对象的指针streambuf。该对象表示流的内部缓冲区。

您可以调用streambuf::pubsetbuf(char * s, streamsize n)以设置给定大小的新内部缓冲区。

请参阅此链接了解更多详细信息。

编辑:您的情况如下:


#include <iostream>
#include <fstream>
using namespace std;

int main(int argCount, char ** argList[])
{
    ifstream inStream(argList[1]);

    char myBuffer [512];
    inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));

    char ch;
    while(inStream.read(&ch, 1))
    {
        cout << ch;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如litb所指出的, 的实际行为streambuf::pubsetbuf是“实现定义的”。

如果您确实想使用缓冲区,您可能必须推出自己的继承自streambuf.

  • 我在标准中查找了它,因为我不知道 pubsetbuf 做了什么,它说它是实现定义的。除了任何 I/O 之前的 pubsetbuf(0, 0) 将禁用缓冲 (2认同)