1

ifstream::readsome(buf, size)バッファに十分なスペースがない場合、メソッドがすべてのバイトを読み取らないことを調査しました。例:

私はバッファを持っています:4096バイト。ファイルの先頭からのオフセット: 6 バイト。私は電話します ifstream::readsome(buf, 4097)

関数の結果は 4090 です。したがって、残りの 7 バイトを読みたい場合は、呼び出す必要があります

ifstream::readsome(buf + 4090, 7).

問題は、なぜこの機能がそのように実装されているのかということです。method 内でバッファを超える処理に問題はありませんifstream::readsome(buf, size)

コンパイラ: MSVC 11 (VS 2012)

回答ありがとうございます。

4

2 に答える 2

2

バッファが常に完全に満たされることは保証されていないため、実際には 4906 バイトではなく 4090 バイトになる場合があります。

からcplusplus.com


バッファで使用可能なデータの読み取り ストリームから最大 n 文字を抽出し、s が指す配列に格納します。関連付けられたストリーム バッファ オブジェクト (存在する場合) によって保持される内部バッファが文字を使い果たすとすぐに停止します。 -of-file にまだ到達していません。

この関数は、内部バッファーが使い果たされるとすぐに文字の抽出を停止し、潜在的な遅延を回避するため、最終的にさらに多くの文字を待機する特定のタイプの非同期ソースからデータを読み取るために使用することを意図しています。

この関数は、ストリームに関連付けられた特定のストリーム バッファ オブジェクトの内部構造に依存していることに注意してください。ストリームの動作は、ほとんどが標準クラスの実装定義です。

内部的には、関数は最初に (noskipws を true に設定して) 監視対象オブジェクトを構築することにより、入力シーケンスにアクセスします。次に (問題がなければ)、メンバー関数 in_avail を呼び出して、関連付けられたストリーム バッファー オブジェクトで現在使用可能な文字数を確認し、sbumpc (または sgetc) を呼び出してその数までの文字を抽出します。最後に、戻る前に歩哨オブジェクトを破棄します。

この関数によって正常に読み取られて格納された文字数は、メンバー gcount を呼び出すことによってアクセスできます。


記事はこちらをご覧ください。

于 2013-04-03T10:20:18.763 に答える