エンコーディング間で変換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 を実装する方法について何か提案はありますか?