【问题标题】:C++ duplicate stdout to file by redirecting coutC++ 通过重定向 cout 将标准输出复制到文件
【发布时间】:2013-11-07 14:27:57
【问题描述】:

美好的一天。

我必须使用一些外部函数来生成大量调试信息到标准输出(通过std::cout)。我想通过将cout 重定向到提升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。我怎样才能得到这个?

谢谢, 斯坦尼斯拉夫

【问题讨论】:

  • 什么可怕的外部函数将日志写入 cout ?除了将输出通过外部管道传输到文件之外,没有标准的方法来捕获它。你有它的源代码吗?
  • 我有一个来源,但很遗憾,我无法修改它。我使用的函数是粒子物理学大科学框架 (PandaRoot) 的一部分。不幸的是,仅将调试信息打印到 stdout 是许多科学程序的常见问题(
  • 您是否检查过您是否能够创建该文件? assert(logFile.good()); 或类似的?您是否在调试器下运行过它以查看崩溃的位置?
  • 是的,文件很好。这不是问题。
  • 我已经在调试器下运行它,它显示在方法boost::iostreams::flush(std::ostream)中发生了崩溃。

标签: c++ boost stdout iostream


【解决方案1】:

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

通过临时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

【讨论】:

    【解决方案2】:

    尝试使用freopen函数。这是来自cplusplus.com的示例和评论:

    这个函数对于重定向预定义的流特别有用 像 stdin、stdout 和 stderr 到特定文件(参见示例 下面)。

    /* freopen example: redirecting stdout */
    #include <stdio.h>
    
    int main ()
    {
      freopen ("myfile.txt","w",stdout);
      printf ("This sentence is redirected to a file.");
      fclose (stdout);
      return 0;
    }
    

    【讨论】:

    • 复制标准输出比重定向要困难得多。
    • 这只是将stdout 替换为myfile.txt。 OP想写信给stadoutmyfile.txt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多