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

时间:2013-10-28 17:25:06

标签: c++ boost stdout iostream

美好的一天。

我必须使用一些外部函数来生成大量调试信息到stdout(通过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。我怎么能得到这个?

谢谢, 斯坦尼斯

2 个答案:

答案 0 :(得分:4)

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

通过临时rdbuf打破该周期来解决问题,该临时std::cout保存指向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(); } 原始{{1}}的指针:

{{1}}

Live Demo on Coliru

答案 1 :(得分: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;
}