2

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

4

1 回答 1

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)和文件名创建一个实例。当实例被破坏时,输出流将恢复输出到它之前输出的任何位置。

于 2012-12-18T09:00:46.237 回答