将COUT从C 中的各种来源重定向到同一文件

Redirecting cout into same file from various sources in c++

本文关键字:重定向 文件 COUT      更新时间:2023-10-16

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

明显的答案是,您永远不要输出 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)和文件的名称。当实例是破坏了,输出流将恢复输出无论何时输出之前。