将cout重定向到文件c ++

时间:2012-12-18 08:11:14

标签: c++ cout output

我的问题是我在项目的各种文件中有几个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 中?

1 个答案:

答案 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)和文件名。当实例是 在破坏后,输出流将恢复输出 无论以前输出的是什么。