將C STDOUT 重定向到自訂函數
將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,但它可能無法重定向 printf 等函數的所有 stdout,這些函數通常同時針對 stdout 和 stderr 流。
對於更大的數據,可以採用更先進的技術,如 freopen()、setbuf()、dup() 和 dup2()。這些操作需要更多的系統級理解,並且可能涉及創建管道或操作文件描述符。
以上是如何將 C STDOUT 重新導向到使用者定義的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!