C STDOUT をカスタム関数にリダイレクトする
標準出力をファイルにリダイレクトするのは一般的な方法ですが、それを次のようにリダイレクトしたい場合はどうすればよいですか?あなたが定義した関数ですか?
たとえば、次の仮定のケースを考えてみましょう:
<code class="cpp">void MyHandler(const char* data); // <Magical redirection code> printf("test"); std::cout << "test" << std::endl; // MyHandler should have been called with "test" twice at this point</code>
ソリューション
@Konrad Rudolph が指摘したように、stdout を関数にリダイレクトするostringstreamを使用すると可能です。その方法は次のとおりです。
<code class="cpp">// Redirect cout. std::streambuf* oldCoutStreamBuf = std::cout.rdbuf(); std::ostringstream strCout; std::cout.rdbuf(strCout.rdbuf()); // This goes to the string stream. std::cout << "Hello, World!" << std::endl; // Restore old cout. std::cout.rdbuf(oldCoutStreamBuf); // Will output our Hello World! from above. std::cout << strCout.str();</code>
このメソッドは cout、cerr、clog に対して機能しますが、通常 stdout ストリームと stderr ストリームの両方を対象とする printf などの関数のすべての stdout をリダイレクトしない可能性があります。
より大きなデータの場合は、freopen()、setbuf()、dup()、およびdup2() を使用することができます。これらの操作には、もう少しシステムレベルの理解が必要であり、パイプの作成やファイル記述子の操作が含まれる場合があります。
以上がC STDOUT をユーザー定義関数にリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。