说我这样做(一个人为的例子):
#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文件,我想尝试不同的缓冲区大小,看看它是否会影响性能。
答案 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
的缓冲类。