gpt4 book ai didi

c++ - Tee-ing 输入 (cin) 输出到日志文件(或堵塞)

转载 作者:行者123 更新时间:2023-11-30 01:32:50 24 4
gpt4 key购买 nike

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

我已经阅读了有关 boost::tee_device 的内容,它与我的要求非常相似。不幸的是,它是作为 ostream 实现的,因此从“管道的另一端”解决了类似的问题。

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

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

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

谢谢!

编辑:我可以将所有地方的代码更改为:cin >> value;阻塞 << 值; ——但这将是一个重大而丑陋的变化。我也希望有一种简单的方法来关闭注销。因此,我想要一种方法将其建模为一个 istream“过滤器”,然后用这个 istream“记录器”简单地替换所有对 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
}

等等

最佳答案

使用 Boost.IOStreams,您可以定义一个输入过滤器,将其读取的内容记录到 clog 中。像这样的东西:

(警告:前方未经测试的代码)

class LoggingInputFilter : public multichar_input_filter {
public:
template<typename Source>
std::streamsize read(Source& Src, char* S, std::streamsize N)
{
streamsize result = read(Src, S, N);
if (result == -1){
return result;
}

if (std::clog.write(S, result)){
return result;
}

return -1;
}
};

用 std::cin 链接它:

LoggingInputFilter cin_logger;
filtering_stream logged_cin(cin_logger);
logged_cin.push(std::cin);

并使用 logged_cin 代替 std::cin

编辑:或者在streabuf级别进行操作,这样你的代码仍然使用std::cin:

LoggingInputFilter cin_logger;
filtering_streambuf logged_cin(cin_logger);
logged_cin.push(std::cin.rdbuf());
std::cin.rdbuf(logged_cin);

关于c++ - Tee-ing 输入 (cin) 输出到日志文件(或堵塞),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/998072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com