将cout或cerr重定向到文件很容易。我可以使用它将第三方输出重定向到一个文件。但是,在将第三方输出重定向到文件之后,我如何使用cout自己输出到控制台?将cout或cerr重定向到文件后使用cout或cerr输出到控制台
2
A
回答
4
我RAII的忠实球迷,所以我曾写了这个小助手类。它将重定向流直到它超出范围,此时它会恢复原始缓冲区。非常方便。 :)
class StreamRedirector {
public:
explicit StreamRedirector(std::ios& stream, std::streambuf* newBuf) :
savedBuf_(stream.rdbuf()), stream_(stream)
{
stream_.rdbuf(newBuf);
}
~StreamRedirector() {
stream_.rdbuf(savedBuf_);
}
private:
std::streambuf* savedBuf_;
std::ios& stream_;
};
可以使用这样的:
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;
4
您保存缓冲并在以后恢复它:
std::streambuf *buf = std::cout.rdbuf(); //save
// Do other stuff
std::cout.rdbuf(buf); // restore
+0
如果第三方库有其他线程调用cout会怎么样? – inetknght
+1
@inetknght:[查看此SO问题](http://stackoverflow.com/questions/6374264/is-cout-synchronized-thread-safe)了解有关C++ 03和C++ 11之间差异的更多信息,但基本上你必须自己管理同步,并确保多个线程不同时写入cout。 –
相关问题
- 1. 管道cout干扰cerr
- 2. 为什么CERR刷新COUT
- 3. Visual Studio 2012 cout未显示,但cerr
- 4. 多个线程写入std :: cout或std :: cerr
- 5. 将调试输出重定向到空流而不是std :: cerr
- 6. 将cout重定向到文件C++
- 7. 如何在Linux中将cout重定向到控制台?
- 8. 将std :: cout重定向到新创建的控制台
- 9. 是否有必要重置cout,cerr和clog的rdbuf,如果它们已被更改为重定向到文件?
- 10. 什么时候使用cerr和当cout在C++中?
- 11. C++函数cout重定向到文件
- 12. 将输出重定向到控制台
- 13. 尝试将std :: cerr重定向到文件时出现访问冲突异常
- 14. 自定义C++的cout类 - 输出到控制台和日志文件
- 15. 将std :: cout重定向到QTextEdit
- 16. 将cout捕获/重定向到函数
- 17. 将std :: cout重定向到QTextEdit
- 18. 如何将std :: cout重定向到UITextView?
- 19. 如何将控制台输出重定向到文本文件
- 20. cout,cin,cerr和clog中的“c”是什么意思?
- 21. 如何在cout/cerr上打印USB字符串描述符?
- 22. 同一类型的对象cout,cerr,clog表现如何不同?
- 23. iostream对象如何实现cin,cout,cerr和clog?
- 24. Robot Framework:如何将控制台输出重定向到文件
- 25. 将控制台输出重定向到日志文件
- 26. Xcode 5,如何将控制台输出重定向到文件
- 27. 将SWI-Prolog控制台输出重定向到一个文件
- 28. scala 2.11:如何将控制台输出重定向到文件
- 29. 重定向控制台输出到UNIX
- 30. 重定向std :: cout
什么是 “第三者输出”? –
通常从代码中的另一个团队调试喋喋不休的人写道。我想我可以戳他们给我一个接口,让他们输出到别的地方。但我想知道是否有另一种方法可以解决这个问题,以防我进入一种我无法影响被调用代码的情况。 – inetknght