2008-12-09 64 views
3

说我这样做(一个人为的例子):如何发现/控制C++ fstream中内部缓冲的级别?

#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库在这里做了一些内部缓冲,不会把它变成一个在字节的文件读取操作的gazillions OS级别。

有没有一种方式:

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

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

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

回答

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

+0

在调用pubsetbug中使用'sizeof(myBuffer)'会更好吗? – 2008-12-09 02:39:42