問題タブ [filebuf]
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++ - filebuf :: seekoff()と相互作用するGNU C ++ filebuf :: underflow()への変更を説明する
私の会社の製品は、多くの認定されたLinuxハードウェア/ソフトウェア構成で動作します。歴史的に、使用されているコンパイラはGNUC++でした。この投稿の目的のために、バージョン3.2.3のベースラインについて考えてみましょう。これは、ソフトウェアがそのバージョンを通じて「期待どおりに機能した」ためです。
GNU C ++バージョン3.4.4を使用した、より新しい認定プラットフォームの導入により、これまでに見たことのないいくつかのパフォーマンスの問題が観察され始めました。少し掘り下げた後、エンジニアの1人がこのテストプログラムを思いつきました。
約751KB文字のログファイルに対して実行しました。以前の構成では、次の結果が得られました。
新しいバージョンでは、結果は次のようになります。
pubseekoff(0、ios :: cur)呼び出しをコメントアウトすると、過剰なunderflow()呼び出しがなくなります。したがって、明らかに、g ++の新しいバージョンでは、pubseekoff()を呼び出すとバッファが無効になり、underflow()が強制的に呼び出されます。
標準ドキュメントを読みましたが、pubseekoff()の言い回しは確かにあいまいです。たとえば、基になるファイルポインタの位置とgptr()の位置との関係は何ですか?underflow()の呼び出しの前または後?それにもかかわらず、いわば、g++が「中流で馬を変えた」ことは苛立たしいことだと思います。さらに、一般的なseekoff()でバッファポインタを無効にする必要がある場合でも、ftell()と同等のものが必要なのはなぜですか?
この振る舞いの変化につながった実装者間のディスカッションスレッドを誰かに教えてもらえますか?関連する選択とトレードオフについて簡潔に説明していますか?
追加クレジット
明らかに、私は自分が何をしているのか本当にわかりません。私は、オフセットが0で、seekdirがios :: curの場合に無効化をバイパスする方法があるかどうかを判断するために実験していましたが、移植性はありません。私は次のハックを思いつき、 filebufデータメンバー_M_fileに直接アクセスしました(これは私のマシンの3.4.4バージョンでのみコンパイルしたかったです):
ただし、100回のシークオフ試行ごとに位置を出力する診断では、毎回8192が生成されます。は?これはfilebuf自体のFILE *
メンバーであるため、ファイル位置ポインターがfilebufによって行われるunderflow()呼び出しと同期していると思います。なぜ私は間違っているのですか?
アップデート
まず、私の投稿のこの後半部分は、移植性のないハッキングに関するものであることを理解していることを強調しておきます。それでも、ここで核心を理解していません。電話してみました
代わりに、これは8192でスタックするのではなく、サンプルファイルを順調に進みます。
最終更新
私の会社の内部では、パフォーマンスへの影響を十分に減らすためのいくつかの回避策を作成しました。
外部的には、DavidKraussがGNUのlibstdc++ストリームに対してバグを報告し、最近、PaoloCarliniが修正をチェックインしました。コンセンサスは、望ましくない動作は標準の範囲内であるが、私が説明したエッジケースには合理的な修正があったというものでした。
StackOverflow、David Krauss、Paolo Carlini、そしてすべてのGNU開発者に感謝します!
c++ - ロギングのために wfilebuf (filebuf) から派生しようとしています
私は基本的に wfilebuf から派生させようとしているので、ファイルに出力し、出力をインターセプトしてコンソール/デバッグウィンドウに出力し、ここに示すようにできます: http :// Savingyoutime.wordpress.com/2009/04/ 21/および/またはここ: http :// Savingyoutime.wordpress.com/2009/04/22/40/
(古代のサポート アイデア: http://www.horstmann.com/cpp/streams.txt )
私はほとんどそれを手に入れましたが、基になるファイルへの書き込みと入力の覗き見の両方ができないようです。
2 番目の例と同様に sync() 関数を上書きしましたが、setp(...) でバッファを設定しない限り、pbase() と pptr() は常に NULL のように見えますが、これはファイル出力を壊すようです。ファイルは常に空です。
これに対する私の大雑把な試みは以下のとおりです。
完全な開示: 以前に似たようなことについて質問しました: Simple wostream logging class (with custom stream manipulators)
私はその問題を解決したと思います。
どんな助けでも大歓迎です!ありがとう!
c++ - std :: fstreamに複数のバッファがありますか?
次のように、ファイルストリームに1つのバッファを指定できます。
私が今やりたいのは、複数のバッファーを使用することです。
std :: streambufのカスタム派生を作成せずに可能ですか?
編集: 私がやりたいことをもっと詳しく説明する必要があると思います。次の状況を考慮してください。-読み取りたいファイルがメモリに収まらない-ある種のバイナリジャンプ検索によってアクセスされているファイル
したがって、ファイルを特定のサイズの論理ページに分割する場合は、特定のページを表す複数のバッファーを提供したいと思います。これにより、ファイルの場所が読み取られ、関連するページがすでにバッファーにある場合のパフォーマンスが向上します。
c++ - ファイルの読み取りで filebuf を使用する場合
読み取り専用のバイナリ ファイルからランダム アクセス読み取りを実行します。ifstream へのインターフェイスは、filebuf よりも単純に見えます。しかし、filebuf がパフォーマンスを向上させるユースケースはありますか?
詳細: 固定長 (48 バイト) レコードのファイルがあり、ランダム アクセス読み取りを順番に実行します -- 1 レコードを読み取り、処理し、(他の場所から) 1 レコードを読み取り、処理... (ツリーをたどる。) ファイルは変更されません。レコードは固定長であるため、後で 48 バイトのレコードである「文字型」を使用する可能性がありますが、それがパフォーマンスに影響を与えるとは思いません。
c++ - カスタマイズされた「ofstream」出力
ロギング ストリーム サービスを作成するには、ofstream クラスを拡張する必要があります。
目標は、各行をインターセプトして、各行の先頭にカスタマイズされたテキスト (日付/時刻、重大度など) を追加することです。
さて、私が C++ の第一人者ではないことは明らかなので、このタスクに関する多くのドキュメントを読みました。
http://www.angelikalanger.com/Articles/Topics.html#CPP
http://asmodehn.wordpress.com/2010/06/20/busy-c-coding-and-testing
http://gabisoft.free. fr/articles-en.html
上記の記事では、カスタム ストリーム バッファを作成することを提案していますが、この概念をファイル ストリームに移植する際に、多くの問題に遭遇しました。
この目標を達成するためのより簡単な方法はありますか?
c++ - __gnu_cxx::stdio_filebuf を使用してストリーム配信できません
これによりファイルが作成されますが、何も書き込まれません。
出力を達成するための他の簡単な解決策があることは知っていますが、この非標準の filebuf を使用して編集中にファイルをロックし、他のプロセスがファイルを開くことができないようにする必要があります。なぜこれが機能しないのかわかりません。
c++ - iostream を使用して filebuf から読み書きする
iostream
から を割り当てるとstringbuf
、すべてがうまく機能します
17 42
ただし、stringbuf
a を使用するように変更しようとすると、filebuf
機能しなくなります
0 0
ghex"/tmp/buffer.dat"
には、想定される内容が含まれているとのことです。
filebuf
ファイルを閉じて再度開くことなく、から読み書きすることは可能ですか?
c++ - クラスコンストラクターで機能しない標準関数と操作
コンストラクターを使用して最初のクラスを作成しようとしていますが、奇妙な動作をしているようです。私のクラスはから派生してfilebuf
おり、何らかの理由でコンストラクターで開くことができません。cout
デバッグ用のステートメントを追加しようとしましたが、<<
演算子が認識されません。
bin.h