問題タブ [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.
c++ - 独自の ostream/streambuf を作成するにはどうすればよいですか?
教育目的で、ostream とストリーム バッファを作成して実行したいと考えています。
- << myVar; を実行するときのエンディアンを修正します。
- std:cout を使用したり、ファイルに書き込む代わりに、deque コンテナーに格納します。
- << を実行した回数、.write を実行した回数、書き込んだバイト数、flush() を実行した回数などの追加データをログに記録します。しかし、私はすべての情報を必要としません。
オーバーロードを試みましたが、ひどく失敗しました。私はやってみました
私のbasic_stringstream2クラス(私はbasic_stringstreamを私のcppファイルにコピーして貼り付けて変更しました)で、コードはbasic_ostreamを使用し続けました. コードを調べたところ、xsputn をオーバーロードする必要があるようです (このページhttp://www.cplusplus.com/reference/iostream/ostreamには記載されていません) が、他に何がオーバーロードする必要がありますか? クラスを構築するにはどうすればよいですか (継承する必要があるものなど)。
c++ - std::coutをカスタムライターにリダイレクトする
Mr-Eddのiostreams記事のこのスニペットを使用して、 std::clogをどこかに印刷したいと思います。
だから、メインループで、私は次のようなことをします
これがostringstreamのドキュメントですが、これを行うための最良の方法を理解するのに苦労しています。テキストを表示するメソッドがあります。ostringstream内の任意のデータを使用して呼び出したいだけです。
std :: clogに送信されたものを、選択したメソッドにリダイレクトするための最も簡単で最良の方法は何ですか?上記のように、while!eofの部分に入力しますか(方法はわかりません)、それとも、メソッドを呼び出す「commit」演算子をどこかにオーバーロードするなど、より良い方法がありますか?私はすばやく簡単なことを望んでいます。記事のようにブーストIOストリームを使用してシンクなどを定義し始めたくありません。
c++ - iostream のバイナリ バージョン
私はiostreamのバイナリバージョンを書いています。基本的に、バイナリ ファイルを書き込むことができますが、ファイルの形式を細かく制御できます。使用例:
my_int を符号なし 32 ビット整数として書き込み、my_string を長さのプレフィックス付き文字列 (プレフィックスは u16le) として書き込みます。ファイルを読み戻すには、矢印を反転させます。よく働く。しかし、私はデザインに問題があり、それについてはまだ迷っています。だから、SOに尋ねる時が来ました。(現時点では、8 ビット バイト、2 の補数の整数、IEEE 浮動小数点数など、いくつかの仮定を立てています。)
内部では、iostream は streambuf を使用します。これは実に素晴らしい設計です。iostreams は ' int
' をテキストにシリアライズするコードを作成し、基になる streambuf に残りを処理させます。したがって、cout、fstream、stringstream などを取得します。これらはすべて、iostream と streambuf の両方で、通常は char でテンプレート化されますが、wchar としてテンプレート化されることもあります。ただし、私のデータはバイト ストリームであり、' unsigned char
' で表すのが最適です。
私の最初の試みは、に基づいてクラスをテンプレート化することでしたunsigned char
。std::basic_string
テンプレートで十分ですが、そうでstreambuf
はありません。という名前のクラスでいくつかの問題に遭遇しましたが、これはテーマcodecvt
に従うことができませんでした。unsigned char
これにより、次の 2 つの疑問が生じます。
1)なぜストリームバッファがそのようなことをするのですか? コード変換は、ストリームバッファの責任から外れているようです-ストリームバッファはストリームを取り、それとの間でデータをバッファリングする必要があります。これ以上何もない。コード変換と同じくらい高レベルなものは、iostream に属するべきだと感じます。
テンプレート化されたストリームバッファを unsigned char で動作させることができなかったので、char に戻り、単に char/unsigned char の間でデータをキャストしました。明らかな理由から、キャストの数を最小限に抑えようとしました。ほとんどのデータは、基本的に read() または write() 関数にまとめられ、その後、基になる streambuf が呼び出されます。(そして、プロセスでキャストを使用します。)読み取り関数は基本的に次のとおりです。
良い解決策、悪い解決策?
最初の 2 つの質問は、さらに情報が必要であることを示しています。最初に、boost::serialization などのプロジェクトが検討されましたが、それらは独自のバイナリ形式を定義するという点で、より高いレベルに存在します。これは、形式を定義する必要がある場合、または形式が既に定義されている場合、または一括メタデータが不要または不要な場合に、より低いレベルで読み取り/書き込みを行うためのものです。
binary::u32le
第二に、修飾子について質問する人もいます。これは、現時点では必要なエンディアンと幅を保持するクラスのインスタンス化であり、将来的には符号付きになる可能性があります。ストリームは、そのクラスの最後に渡されたインスタンスのコピーを保持し、それをシリアル化で使用しました。これはちょっとした回避策でした。最初は << 演算子を次のようにオーバーロードしようとしました。
しかし、当時、これはうまくいかなかったようです。あいまいな関数呼び出しでいくつかの問題がありました。これは特に定数に当てはまりますが、あるポスターが示唆したように、キャストするか、単に . として宣言することもできconst <type>
ます。しかし、他にも大きな問題があったことを覚えているようです。
c++ - インメモリバッファから C++ std::istringstream を初期化していますか?
C++ アダプターを介して mySQL の Blob に格納したいメモリ ブロック (不透明) があります。アダプターは istream を予期します。
したがって、私の質問は、このメモリ ブロック (char* として入力) から std::istream を作成するにはどうすればよいかということです。null で終了していないため、文字列ではありません (もちろん、その長さはわかっています)。
たとえば std::string にメモリ ブロックをコピーせずにそれを行う方法を見つけることができませんでした。これはちょっともったいないと思います。このようなものは機能しません:
std::streambuf にはそのようなコンストラクタがないためです。次の提案を見ました。
それは正しい方法ですか?
c++ - スレッドセーフロギング
複数のスレッドからロギングするための単純なクラスを実装したいと思います。ログを記録したい各オブジェクトは、通常の演算子を使用してメッセージを書き込むことができるostreamオブジェクトを受け取るという考え方があります。望ましい動作は、ストリームがフラッシュされたときにメッセージがログに追加されることです。このようにして、メッセージが他のスレッドからのメッセージによって中断されることはありません。ほとんどのメッセージが少なくとも2ライナーになるため、メッセージを格納するために一時的な文字列ストリームを使用することは避けたいと思います。私が見ているように、これを達成するための標準的な方法は、独自のストリームバッファを実装することですが、これは非常に面倒でエラーが発生しやすいようです。これを行うためのより簡単な方法はありますか?そうでない場合は、カスタムストリームバフに関する優れた記事/ハウツー/ガイドを知っていますか?
前もって感謝します、
Space_C0wbo0y
アップデート:
それはうまくいくようですので、私は自分の答えを追加しました。
performance - C++: 最高のテキスト アキュムレータ
テキストは、クライアントに送信される前に断片的に蓄積されます。
ここで、各ピースに大量の文字としてメモリを割り当てる独自のクラスを使用します。(とにかく、char[][]
+のように動作しstd::list<char*>
ます)。
次に、文字列全体を構築し、それを std::sting に変換してから、それをboost::asio::streambuf
使用して作成します。それは十分に遅いと思います。私が間違っている場合は修正してください。
多くの場合、単純なFILE
タイプの fromstdio.h
が使用されます。それはどのように機能しますか?書き込みごとにメモリを割り当てます。それで、それはより速く、から読み込む方法はありますboost::asio::streambuf
かFILE
?
追加: うーん。私は一つの大きなことを忘れていました:)。dll とメイン アプリケーションのコンパイルは少数のコンパイラで行われるため、その中に stl を含める必要はありません。通常、dll の実行中に多くの問題が発生するためです。
c++ - streambuf または basic_ostringstream を派生していますか?
operator<< を使用してスローされるメッセージを作成できるように、stringstream を派生させたいと考えています。API は次のようになります。
これは
だから私がしたことは、「オーバーフロー」メソッドをオーバーロードし、ostream(&errorbuf) を作成する errorbuf (streambuf から継承) を作成することです。代わりにbasic_ostringstreamなどから継承すべきではないのだろうか...
c++ - basic_streambufに基づいてfiltered_streambufを作成するにはどうすればよいですか?
送信データがフィルターに従って変更されるように、ストリームにフィルターを挿入する必要があるプロジェクトがあります。いくつかの調査の後、私がやりたいのは次のようなfiltered_streambufを作成することのようです。
次に、filtered_streambuf<>
フィルタリングする必要のあるストリームにを挿入します。私の問題は、ストリームをフィルタリングするときに維持する必要のある不変条件がわからないことです。
- 派生クラスは期待どおりに機能します。特に、filtered_streambufsが他のfiltered_streambufsの上に構築されていることに気付く場合があります。
- さまざまなストリームインサーター、エクストラクター、マニピュレーターはすべて期待どおりに機能します。
問題は、iostreamが正しく機能するために必要なものを確実に持つために、提供する必要のある最小限のインターフェイスが何であるかを理解できないように見えることです。
特に、保護されたポインター変数の動きを偽造する必要がありますか?偽のデータバッファが必要ですか?パブリック関数をオーバーライドして、ベースstreambufの観点から書き直すことはできますか、それとも単純すぎますか?
c++ - BoostAsioを使用したシリアルポートからの読み取り
を使用して、シリアルポートで受信データパッケージを確認したいと思いますboost.asio
。各データパケットは、1バイト長のヘッダーで始まり、送信されたメッセージのタイプを指定します。異なるタイプのメッセージにはそれぞれ独自の長さがあります。私が書きたい関数は、新しい着信メッセージを継続的にリッスンする必要があり、メッセージが見つかったらそれを読み取り、他の関数を呼び出して解析する必要があります。私の現在のコードは次のとおりです。
boost::asio::streambuf
使用するのに適切なツールですか?そして、メッセージを解析できるように、そこからデータを抽出するにはどうすればよいですか?また、この関数を呼び出すだけの別のスレッドが必要かどうかを知りたいので、より頻繁に呼び出されます。トラフィックが多く、シリアルポートのバッファが不足しているために、関数への2つの呼び出しの間にデータが失われることを心配する必要がありますか?私はGUIにQtのライブラリを使用していますが、すべてのイベントを処理するのにどれくらいの時間がかかるのか本当にわかりません。
編集:興味深い質問は、シリアルポートに着信データがあるかどうかを確認するにはどうすればよいですか?着信データがない場合、関数をブロックしたくありません...