問題タブ [streambuf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
streambuf - ブーストストリームバッファの消費とコミット、それは何ですか
consumer() と commit() が実際に何を意味するのかについての良い説明が見つからないようです。実際には、streambuf をまったく理解していません。
私の理解では、streambuf は単なる文字配列です。しかし、なぜそれがドキュメントにあるのですか、
実際には多くのバッファがありますか?そして、「入力シーケンス」と「出力シーケンス」とは何ですか? これらは別の 2 つのバッファーですか?
次のコードは実際に何をしますか?
b.prepare() を呼び出すと、read() がデータを配置するための新しいバッファが割り当てられますか? では、データがそのバッファから基になる streambuf バッファに転送されるのはいつですか? commit()かと思ったのですが、
そのため、コミットは実際にデータを「出力シーケンス」から「入力シーケンス」に移動するように見えますが、データを格納するために使用される基礎となるバッファーについて言及することはありません!
c++ - 別の streambuf を使用して一時的な ostream を作成する必要がありますか?
ostream &
パラメータを取り、o
その ostream に書き込む関数があるとします。operator <<
実装は良い例です。
関数内で、ストリームの書式設定オプションを指定したい場合があります。o
たとえば、関数に渡されるときに がどのように構成されていても、数値を 16 進数として出力したい場合があります。
第 2 に、現在の書式設定フラグについて推測できるようになりたいと思うかもしれません。たとえば、別の方法で要求しない限り、数値が 10 進数としてフォーマットされていると想定できると便利です。
最後に、関数が終了するまでに、書式設定オプションをo
関数が呼び出される前と同じにして、呼び出し元に変更されないようにします。これは単に発信者に対する礼儀の問題です。
これまではostringstream
、関数内に local を作成し、その上ですべての作業 (書式設定オプションの設定を含む) を行い、関数の最後に .str()
toを送信することでこれを達成してきました。ここでの StackOverflow の質問は、私より賢い人が同じアプローチを取ることを示唆しています。 ただし、ostringstreams に非常に多くのデータを保持しているため、以前に出力に送信される可能性があることが気になります (文字列が非常に大きくなる可能性があります)。o
2 つの質問があります。
1)一時的な(スタックベースの)ostreamを作成し、そのostreamで作業を行うことは、合法的、慣用的、適切な形式ですか?o.rdbuf()
私自身のテストとcppreference.comのページは、私ができることを示唆しているようです。
2)私が考えていない別のより良い方法はありますか?
c++ - boost::asio::streambuf の操作
boost::asio を探していた (そして自身も boost を使って) 非同期サーバーを作成することにしました。受信データを保存するには、boost::asio::streambuf を使用します。ここで問題があります。クライアントから 2 番目のメッセージを受信した後、バッファに以前のメッセージのデータが含まれていることがわかります。入力バッファで Consume メソッドを呼び出しますが。どうしたの?
c++ - データをエスケープするための std::streambuf のオーバーロード
std::ostream*
ポインターを渡すことで大量のデータを書き込むことができる外部ライブラリがあります。バイナリ形式で書き込みます
このデータを、16 進数または base64 に変換して、他のデータを含むテキスト ファイル内に書き込みたいと考えています。
ライブラリによって書き込まれるデータは非常に大きくなる可能性があるため、データをメモリ バッファーに書き込むことを避け、テキスト形式に変換したいと考えています。その場で変換したいと思います。
したがって、その目的のために std::streambuf をオーバーロードする方法を探しています。overflow
仮想関数をオーバーロードする必要があり、これに必要な情報を見つけました。
問題は、ファイルの に書き込むべきか、またはを使用して取得できるファイルostream
に直接書き込むべきかということです。に直接書き込むことはできますか?streambuf
rdbuf()
stream
stringbuf
前もって感謝します!
c++ - boost::asio は、ソケットからストリームバッファに n バイトを読み取ります
ソケット経由で送信されるシリアル化された構造があります。そのフィールドの 1 つに残りのデータのサイズが含まれているため、チャンクで読み取る必要があります。最初の数バイトを読み取り、長さを調べて、残りを読み取る必要があります。これは私が持っているものです:
私は見てみました
ただし、boost::asio::buffer へのデータのみを読み取ることができます。boost::asio::streambuf で同じことができるかどうか疑問に思っていますか? 前もって感謝します。