6

私はほとんどの C++ に精通していますが、私が避けてきた領域の 1 つは IO ストリームでした。これは主に、適切でない組み込みシステムで使用してきたためです。しかし、最近はそれらに慣れる必要があり、シンプルであるべきだと思うものを見つけるのに苦労しています.

私が探しているのは、固定数の文字を C++ ストリームから に読み込む比較的効率的な方法ですstd::stringcharメソッドを使用して一時配列を簡単に読み取り、read()それを に変換できますstd::stringが、これはかなり見苦しく、無駄なコピーを伴います。次のような方法で、ストリーム全体を文字列に読み取ることもできます。

std::string getFile(std::fstream &inFile)
{
    std::stringstream buffer;
    buffer << inFile.rdbuf();
    return buffer.str();
}

...しかし、メモリへの無制限の読み取りは一般的にはお勧めできません。そのため、一度に 1 ブロックずつ、たとえば 4K 程度でファイルにアクセスしたいと考えています。char一度に文字を読み取ることもできますが、一時的な配列に読み取るよりも醜く、効率が悪いと感じます。

では、ストリームから次のN文字std::stringを含むストリームから直接取得する簡単な方法はありますか? これを行う方法がまったくないのかもしれませんが、そのようなものが欠けているのは奇妙に思えるので、明らかに何かが欠けているに違いないと感じました。

ところで、私は C ファイル IO API に精通しており、それらに関連するソリューションを探しているわけではありません。read()とで何かをノックアップすることはできますが、私が扱ってwrite()いるコードはストリームを多用しているため、コードの追加を一貫したスタイルに保つことをお勧めします。

4

1 に答える 1

9

あなたは正しい軌道に乗っています。:)

mystring.resize( 20 );
stream.read( &mystring[0], 20 );

編集:

C++11 で。これは明確に定義されており、安全です。 や とは異なり 、基になるデータへの変更可能な参照を提供 します。data()c_str()std::string::operator[]

C++03 では実用上は安全ですが、 の定義がstd::string弱すぎて安全を保証できませんでした。 C++03 では、文字列データが連続していないことが許可されていましたが、利用可能な実装でこれを利用したことはないと思います。

于 2013-04-08T15:52:12.033 に答える