1

我想创建一个类似流的类,通过它我可以同时写入std::outstd::clog.

我有以下代码,但问题是它只写入std::clog,而控制台上的输出与预期不同(奇怪的是,它会覆盖自身)。

struct Log : public std::ofstream
{
    Log(const std::string filename)
    : std::ofstream(filename.c_str())
    {
        std::clog.rdbuf(this->rdbuf());
    }
};

template <typename T>
Log & operator << (Log & stream, const T & x)
{
    std::cout << x;
    std::clog << x;
    return stream;
};

我想要的是这个

Log log("logfile.txt");
log << "this should go to the console and the logfile" << 1234 << std::endl;

这可以做到吗?

4

2 回答 2

1

我找到了一个(或“那个”)解决方案!

我添加了以下代码:

Log & operator << (Log & stream, std::ostream & (*f)(std::ostream&))
{
    std::cout << f;
    std::clog << f;
    return stream;
}

这增加了还接受例如std::endl(或 中的其他函数调用std::ostream)的功能,现在其行为符合预期。

于 2014-11-17T13:19:36.127 回答
0

通常不需要手动编写这样的装置来将您的输出定向到多个位置。

为此使用tee实用程序。

于 2014-11-17T11:49:28.720 回答