C++ 通过重定向 cout 将 stdout 复制到文件

标签 c++ boost stdout iostream

美好的一天。

我必须使用一些外部函数来向 stdout 生成大量调试信息(通过 std::cout)。我想通过将 cout 重定向到 boost tee_device 来将此信息复制到某个日志文件。我使用以下示例代码:

typedef boost::iostreams::tee_device<ostream, ofstream> TeeDevice;
typedef boost::iostreams::stream<TeeDevice> TeeStream;

int main(int argc, char** argv) {

    remove("file.log");
    ofstream logFile;
    logFile.open("file.log");
    TeeDevice outputDevice(cout, logFile);
    TeeStream logger(outputDevice);    

    cout.rdbuf(logger.rdbuf());
    cout << "some log info";//this should print both to stdout and to file

    logger.close();
}

但是,我在尝试运行此程序时遇到段错误。为什么?

我知道我可以这样做

    logger << "some debug log info";

但我确实需要重定向cout。我怎样才能获得这个?

谢谢, 斯坦尼斯拉夫

最佳答案

您将 TeeDevice 输出设置为 std::cout,然后将其 rdbuf 替换为依赖于 TeeDevice 的输出code> (取决于 std::cout)。

通过临时 std::ostream 打破该循环来解决问题,该临时 std::ostream 保存指向 std::cout 的原始 rdbuf 的指针:

int main()
{
    remove("file.log");
    ofstream logFile;
    logFile.open("file.log");

    ostream tmp(cout.rdbuf()); // <----
    TeeDevice outputDevice(tmp, logFile); // <----
    TeeStream logger(outputDevice);    

    cout.rdbuf(logger.rdbuf());
    cout << "some log info" << endl;

    logger.close();
}

Live Demo on Coliru

关于C++ 通过重定向 cout 将 stdout 复制到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641190/

相关文章:

c++ - FUSE_NOTIFY_CODE_MAX 是什么,为什么没有初始化?

c# - 我对 COM 和跨平台兼容性感到困惑

python - 打印到 Python : redirect vs print's file argument vs write 中的文件

python - Python 线程中进行多个 stdout w/flush

c++ - 管理模板派生类型的 vector 集合

java - 使用 Java 中的标准输入/输出与 C 程序通信

c++ - 与指针混淆

c++: argv 包含一些空格

c++ - 在 boost::asio 中是否可以有一个具有多个执行时间的 deadline_timer?

c++ - 在生产者-消费者代码中使用 wait() boost 条件死锁