将 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中文网其他相关文章!