2

再会。

我必须使用一些外部函数来为标准输出(通过)产生大量调试信息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。我怎样才能得到这个?

谢谢, 斯坦尼斯拉夫

4

2 回答 2

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();
}

Coliru 上的现场演示

于 2013-10-28T18:53:17.983 回答
1

尝试使用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;
}
于 2013-10-28T18:55:33.377 回答