【发布时间】:2010-11-03 03:22:55
【问题描述】:
我正在寻找一种方法,将从 istream(在我的情况下为 cin)读取的输入分支(tee)到日志文件(clog/ofstream/etc),同时仍使用输入进行处理。
我已经阅读了关于 boost::tee_device 的信息,它与我的要求非常相似。不幸的是,它是作为 ostream 实现的,因此从“管道的另一端”解决了类似的问题。
我尝试编写一个 istream(适配器)类,它将输入函数转发到包装的输入流 (cin),并将读取的内容发送到日志文件。
这适用于直接调用 operator>>(...) 的基本类型,但是,我遇到了输入流的一些更高级用法的问题,例如,对于 operator>>(std::string ) 和 std::string getline 函数。
有没有更简单的方法来做到这一点(可能通过 rdbuf() 操作)?
谢谢!
编辑:我可以将我的代码到处更改为:cin >> value;堵塞
理想的解决方案:
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
}
等等
【问题讨论】:
-
我曾经尝试过一次你在上面的帖子中写的东西,它一直有效,直到到达特殊字符(如 endl),然后类停止按预期工作。我期待在这里看到答案。