由于其他答案没有提到该怎么做,所以我会在这里提供。您需要保存和恢复 cout 应该管理的缓冲区。例如:
#include <fstream>
#include <iostream>
// RAII method of restoring a buffer
struct buffer_restorer {
std::ios &m_s;
std::streambuf *m_buf;
buffer_restorer(std::ios &s, std::streambuf *buf) : m_s(s), m_buf(buf) {}
~buffer_restorer() { m_s.rdbuf(m_buf); }
};
int main()
{
std::ofstream log("oops.log");
buffer_restorer r(std::cout, std::cout.rdbuf(log.rdbuf()));
std::cout << "Oops!\n";
return 0;
}
现在,当cout
' 的缓冲区cout
在程序结束时被销毁之前被替换时,所以当cout
销毁它的缓冲区时会发生正确的事情。
对于简单的重定向标准 io,通常环境已经有能力为你做这件事(例如,在 shell 中的 io 重定向)。而不是上面的代码,我可能只是简单地将程序运行为:
yourprogram > oops.log
另外要记住的一件事是,它std::cout
是一个全局变量,与其他全局变量具有所有相同的缺点。而不是修改它甚至使用它,您可能更喜欢使用通常的技术来避免全局变量。例如,您可以传递一个std::ostream &log_output
参数并使用它,而不是cout
直接使用代码。