5

通常、私は次のようなことをします:

    std::ifstream stream;
    int buff_length = 8192;
    boost::shared_array<char> buffer( new char[buff_length]);
    stream.open( path.string().c_str(), std::ios_base::binary);
    while (stream)
    {
            stream.read(buffer.get(), buff_length);
            //boost::asio::write(*socket, boost::asio::buffer(buffer.get(), stream.gcount()));
    }
    stream.close();

unsigned charバッファに読み込む方法が気になります( boost::shared_array<unsigned char> buffer( new unsigned char[buff_length]);)

4

1 に答える 1

12

最も単純な形式で:

std::vector<unsigned char> vec(
      std::istreambuf_iterator<char>(std::cin)
    , std::istreambuf_iterator<char>()
    );

std::cin実際のストリームに置き換えます。

std::istreambuf_iterator<>は入力反復子であり、ランダムアクセスまたは前方反復子ではないため、上記は複数のメモリ割り当てを行う可能性があります (非常に数バイトを超えるファイルの場合)。のようなイテレータを減算end - beginしたり、呼び出したりしstd::distance(begin, end)ます。ベクトルが最初に空で作成され、次にstd::vector<>::reserve()ファイル長のメモリを割り当てるために呼び出され、最後に上記のようにファイル全体を読み取るために範囲挿入が呼び出された場合、vec.insert(vec.end(), beg, end)1つのメモリ割り当てに減らすことができます。begendstd::istreambuf_iterator<>

ファイル サイズが数キロバイトを超える場合は、メモリをカーネルからユーザー空間にコピーしないようにプロセス メモリにマップするのが最も効率的です。

使用される理由は、通常は と のみに特殊化std::istreambuf_iterator<char>されている実装が使用するためです。それにもかかわらず、C および C++ 標準では、すべての型がパディング ビットのない同じバイナリ レイアウトを持つ必要があるため、との間の変換 (および同じ型であるのとは異なり、すべて異なる型です) はビット パターンを保持するため、安全です。std::char_traits<>charwchar_tcharcharunsigned charsigned charsigned intint

[ベーシック.ファンダメンタル/1]

無地charsigned char、およびunsigned charは 3 つの異なるタイプであり、まとめてナロー文字タイプと呼ばれます。A char、 a signed char、および anunsigned charは、同じ量のストレージを占有し、同じ配置要件を持ちます。つまり、それらは同じオブジェクト表現を持っています...ナロー文字タイプの場合、オブジェクト表現のすべてのビットが値表現に参加します...符号なしナロー文字タイプの場合、値表現の可能な各ビットパターンは個別の数値を表します。これらの要件は、他のタイプには当てはまりません。特定の実装では、プレーンオブジェクトは aまたは;charと同じ値を取ることができます。どちらが実装定義です。タイプの各値についてsigned charunsigned chariunsigned char0 から 255 までの範囲で、からへの整数変換の結果が であり、から からへの整数変換の結果が であるようなj型の値が存在します。charicharjjunsigned chari

于 2012-04-26T15:35:55.827 に答える