2011-12-12 12 views
5

私はどこでも関数std :: coutを実行している共有ライブラリを使用しています。コールアウトレベルで何かをすることは可能ですか?ここで私はアウトアウトを抑制するか、それをある場所にリダイレクトできますか?関数内でのcout出力の抑制

このようなことをC++で試みることさえ可能ですか?

+2

私はあなたが共有ライブラリへ[freopenは](http://www.cplusplus.com/reference/clibrary/cstdio/freopen/) 'stdout'前後の各呼び出し可能性があるとします。要件に応じて、パフォーマンスとスレッディングが問題になることがあります。 – Joe

+1

'std :: cout.rdbuf()'を使って出力をファイルにリダイレクトすることができます。 – lapk

+0

また、この共有ライブラリは商業的品質のようではありません。このライブラリのソースコードをお持ちの場合は、ログを無効にして再コンパイルする必要があります。責任あるライブラリは、これをプリプロセッサ定義を使って1か所で行うことができます。 – Joe

答えて

4

このようなことは、リダイレクトするライブラリ呼び出し用の関数ラッパーを作成するだけです。cout

int main(void) 
{ 
std::ofstream lStream("garbage.txt"); 
std::streambuf* lBufferOld = std::cout.rdbuf(); 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Normal output" << std::endl; 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling another library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Another normal output" << std::endl; 

lStream.close(); 

return (0); 
} 
+1

rdbufとfreeopenの間にパフォーマンスの違いはありますか?どちらがより良いアプローチですか? – Jithin

+0

@ Jithin私の理解では、 'cout'は各ライブラリ関数呼び出しの前にリダイレクトする必要がありました。その場合、 'rdbuf()'が最も速いと思います。ファイルを一度開いた後にポインタを設定するだけです。 'cout'を一度だけリダイレクトする必要がある場合、両方の方法(' rdbuf'または 'freopen')は本質的に同じです。 – lapk

0

出力を処理するクラスを作成することで、すべてのI/Oを常にフィルタリングできます。クラスがアプリケーション全体で使用される場合、静的クラスが順番に並んでいる可能性がありますが、必要に応じてクラスのインスタンスをインスタンス化できます。

引数の文字列に基づいて、coutに何かを書くかどうか、あるいは別の出力を選択することに加えて、クラスは選択した出力の種類に基づいてテキストをフォーマットすることもできます。

私はostreamを見ましたが、あなたは直接あなたを修正することはできませんでした。あなたは前に出てきた必要性に遭遇したので、これを読んでいる誰かが、私が提案したクラスを作成する上でより良いアイデアを持っていることを願っています。

関連する問題