我正在寻找一种方法,将从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
}
等。