C++ 将控制台重定向到文件后,使用cout或cerr将其输出到控制台

C++ 将控制台重定向到文件后,使用cout或cerr将其输出到控制台,c++,stl,C++,Stl,将cout或cerr重定向到文件非常简单。我可以使用它将第三方输出重定向到文件。但是,在我将第三方输出重定向到文件后,我如何使用cout本人将其输出到控制台?您可以保存缓冲区并在以后恢复它: std::streambuf *buf = std::cout.rdbuf(); //save // Do other stuff std::cout.rdbuf(buf); // restore 我是RAII的超级粉丝,所以我曾经写过这个小助手类。它将重定向流,直到它超出范围,然后恢复原始缓冲区。非常方

将cout或cerr重定向到文件非常简单。我可以使用它将第三方输出重定向到文件。但是,在我将第三方输出重定向到文件后,我如何使用cout本人将其输出到控制台?

您可以保存缓冲区并在以后恢复它:

std::streambuf *buf = std::cout.rdbuf(); //save
// Do other stuff
std::cout.rdbuf(buf); // restore

我是RAII的超级粉丝,所以我曾经写过这个小助手类。它将重定向流,直到它超出范围,然后恢复原始缓冲区。非常方便。:)

可以这样使用:

using namespace std;
cout << "Hello stdout" << endl;
{
    ofstream logFile("log.txt");
    StreamRedirector redirect(cout, logFile.rdbuf());
    cout << "In log file" << endl;
}
cout << "Back to stdout" << endl;
使用名称空间std;

什么是“第三方输出”?通常是从大楼中另一个团队编写的代码中调试聊天。我想我可以戳一下它们,给我一个接口,让它们输出到其他地方。但我想知道,如果我遇到无法影响被调用代码的情况,是否还有其他方法可以做到这一点。如果第三方库中有其他线程调用cout呢?@inetknght:有关C++03和C++11之间差异的更多信息,但基本上你必须自己管理同步,并确保多个线程不会同时向cout写入。我喜欢你使用匿名作用域来处理它。我已经在其他RAII对象中使用了它。除非有更好的解决办法,否则我认为这就行了。它仍然不能解决其他线程的使用问题,特别是当这些线程没有同步机制时。好吧,只要其他线程不更改任何
rdbuf
s,并且在调用任何潜在的线程生成库之前执行重定向,我想应该没有问题吧?除非我在这里遗漏了什么……我认为这取决于实现。我不知道一个线程是否能在线程生成时获得自己的cout状态副本?
using namespace std;
cout << "Hello stdout" << endl;
{
    ofstream logFile("log.txt");
    StreamRedirector redirect(cout, logFile.rdbuf());
    cout << "In log file" << endl;
}
cout << "Back to stdout" << endl;