3

私がこれを行うとします(不自然な例):

#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 ライブラリがここで何らかの内部バッファリングを行い、これを OS レベルで無数の 1 バイトのファイル読み取り操作に変えないことを期待しています。

次の方法はありますか?

a) ifstream の内部バッファのサイズを調べていますか?

b) ifstream の内部バッファのサイズを変更しますか?

数ギガバイトのファイルを小さなチャンクで読み取る必要があるファイル フィルターを作成しています。パフォーマンスに影響するかどうかを確認するために、さまざまなバッファー サイズを試してみたいと思います。

4

1 に答える 1

4

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;
    }
}

編集: litbで指摘されているように、の実際の動作streambuf::pubsetbufは「実装定義」です。

本当にバッファをいじりたい場合は、 から継承する独自のバッファリング クラスを展開する必要があるかもしれませんstreambuf

于 2008-12-09T02:24:12.237 に答える