我的问题是我在项目的各种文件中有几个cout。我希望所有这些都被重定向并保存在 .txt 文件中,而我现在所取得的只是一个cout保存在文件中。我不想为每个 cout 创建单独的 .txt ,以便立即阅读它们。我的代码现在看起来像这样:
#include <fstream>
#include <string>
#include <iostream>
int main()
{
std::ofstream out("out.txt");
std::cout.rdbuf(out.rdbuf());
std::cout << "get it3";
std::cout << "get it4";
}
cout 都在一个文件中,但假设它们有两种不同,如何重定向并保存在一个 .txt 中?
答案 0 :(得分:3)
显而易见的答案是你永远不应该输出
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
)和文件名。当实例是
在破坏后,输出流将恢复输出
无论以前输出的是什么。