4

コールバック関数を実行する方法はありますか、またはデータがまたはなどの標準ストリームに書き込まれるたびに事前定義された関数を呼び出す方法はありますstderrstdout?理想的には、これを使用して、アプリケーションが他のストリームprintfの場合stdoutまたはfprintf他のFILEストリームに対して通常どおりに出力し、現在の設定に応じてアサートなどの追加タスクを条件付きで実行できるようにすることができます。これには、他のライブラリがストリームに出力するときに、このエラー処理コードを自動的にトリガーするという利点があります。

を使用して、出力を他のハンドルstderrstdoutリダイレクトできることを知っています。この動作を提供する代替ストリームを実装することは実用的ですか、それとも多くの標準ライブラリ関数を再実装する必要がありますか?FILEstd::freopenFILE

標準に準拠したC++の提案(C ++ 11を含む)が推奨されますが、必要に応じてWindowsのみのソリューションを利用できます。


それ以来、James KanzeによるStreambufsのフィルタリングの助けを借りて、doomsterによって提案されたようにstreambufferを実装しようと試みました。他の提案が出てこない限り、これが元の提案に最も近いようです。Cスタイルの出力をインターセプトすることはありません。これは、不可能または非現実的であると思われますが、それ以外の場合は、必要なすべての機能を提供します。

4

1 に答える 1

4

これらのストリームへの出力をインターセプトするために、ストリームバッファを置き換えることができます。rdbuf()関数を参照してください。ストリームバッファクラスにoverflow()関数を実装するだけでよいと思います。

于 2013-01-20T22:20:19.823 に答える