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

时间:2008-12-09 02:14:02

标签: 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;
    }
}

我假设(希望)iostream库在这里执行一些内部缓冲,并且不会将其转换为操作系统级别的单字节文件读取操作。

有没有办法:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

有关详细信息,请参阅this link

编辑:以下是您的情况:


#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的缓冲类。