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 内部缓冲区的大小?
我正在编写一个文件过滤器,需要以小块的形式读取数千兆字节的文件,我想尝试不同的缓冲区大小,看看它是否会影响性能。
您可以使用它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.