2008-12-09 63 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