显而易见的答案是你永远不应该输出到
std::cout
. 所有实际输出都应该是一个std::ostream&
,默认情况下可以设置为std::cout
,但您也可以将其初始化为其他内容。
另一个明显的答案是重定向应该在开始该过程之前完成。
但是,假设您无法将代码输出更改为std::cout
,并且您无法控制程序的调用(或者您只想更改某些输出),您可以std::cout
通过附加不同的streambuf
. 在这种情况下,我也会使用 RAII,以确保当您退出时,std::cout
具有它期望的 streambuf。但是类似下面的东西应该可以工作:
class TemporaryFilebuf : public std::filebuf
{
std::ostream& myStream;
std::streambuf* mySavedStreambuf;
public:
TemporaryFilebuf(
std::ostream& toBeChanged,
std::string const& filename )
: std::filebuf( filename.c_str(), std::ios_base::out )
, myStream( toBeChanged )
, mySavedStreambuf( toBeChanged.rdbuf() )
{
toBeChanged.rdbuf( this );
}
~TemporaryFilebuf()
{
myStream.rdbuf( mySavedStreambuf );
}
};
(您可能需要添加一些错误处理;例如,如果您无法打开文件。)
当您进入要重定向输出的区域时,只需使用流(std::cout
或任何其他
ostream
)和文件名创建一个实例。当实例被破坏时,输出流将恢复输出到它之前输出的任何位置。