代码之家  ›  专栏  ›  技术社区  ›  mmocny

将输入(CIN)输出到日志文件(或CLOG)

  •  1
  • mmocny  · 技术社区  · 16 年前

    我正在寻找一种方法,将从IStream(在我的例子中是CIN)读取的输入分支(tee)到日志文件(clog/ofstream/etc),同时仍然使用输入进行处理。

    我读过关于boost::tee_设备的文章,它非常类似于我的要求。不幸的是,它被实现为一个Ostream,从而从“管道的另一面”解决了类似的问题。

    我试图写一个IStream(适配器)类,它将输入函数转发到包装的输入流(CIN),并将读取的内容发送到日志文件。

    对于直接调用operator>>(…)的基本类型,这很好,但是,我遇到了一些更高级的输入流用法的问题,例如,对于operator>>(std::string)和std::string getline函数。

    有没有更简单的方法可以做到这一点(可能通过rdbuf()操作)?

    谢谢!

    编辑:我可以将整个地方的代码更改为类似于:cin>>value;clog<<value;--但这将是一个重大而难看的更改。我也希望有一个简单的方法来关闭注销。因此,我希望有一种方法将其建模为IStream“filter”,然后用该IStream“logger”替换对CIN的所有引用。

    理想解决方案:

    class log_istream : public std::istream
    {
    public:
        log_istream( std::istream & in , std::ostream & out );
    
        /* ... istream forwarding functions ... */
    
    private:
        std::istream & in_;
        std::ostream & out_;     
    };
    
    int main() {
        log_istream logger( std::cin , std::ofstream("logfile.out") );
    
        logger >> value; // this implies infile >> value and logfile << value
        getline(logger,my_string); // this also implies logfile.writeline(value)
        // etc
    }
    

    等。

    4 回复  |  直到 12 年前
    推荐文章