2

エンコーディング間で変換std::basic_streambufする派生ラッパーを実装しました。std::basic_filebufこのラッパー内では、入力と出力の両方に 1 つのバッファーを使用します。バッファリング手法は、この記事から来ています。

今、私が理解できない問題はこれです。への呼び出しで内部バッファがいっぱいになりますunderflow。記事によると、入力から出力に切り替えるときは、バッファーをリンボ状態にする必要があります。これを行うにungetは、バッファ内の未読データが必要です。ドキュメントとソースコードを読んで、成功することを保証するものではungetありません。putbackこれにより、次の入力操作で無効なtellgポインターが残ります。

私は誰かにこれを書くように頼んでいるわけstd::basic_filebufではありませんが、失敗しない方法でデータの取得を管理する方法についてアドバイスを求めています.

唯一確実な方法は、ファイルに書き込まれるバイトを計算し、それに応じてオフセットを調整することだと思います。しかし、それは思ったほど単純ではありません。には、コンパイル時に不明なfilebufが関連付けられている場合があります。localeファセットを取得し、そのメンバーを介してデータを渡そうとしましたoutが、うまくいきません。以前に読み込まれたデータにはデフォルトmbstate_t値が含まれていない可能性があり、一部のcodecvtオブジェクトは BOM も書き込みます。

基本的に、ファイル データのセクションがcodecvt.

「c」ファイルストリームはバッファでも機能し、get および put ポインターも使用するため、この質問に「c」のタグを付けました。std::basic_filebuf「c」ファイルストリームの単なるラッパーです。「c」の回答もこの問題に適用できます。

ファイル ストリームに無制限の unget を実装する方法について何か提案はありますか?

4

0 に答える 0