3

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

#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;
    }
}

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

有没有办法:

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

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

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

4

1 回答 1

4

您可以使用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;
    }
}

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

如果您真的想使用缓冲区,您可能必须滚动自己的缓冲类,该类继承自streambuf.

于 2008-12-09T02:24:12.237 回答