C++ C++;通过重定向cout将标准输出复制到文件

C++ C++;通过重定向cout将标准输出复制到文件,c++,boost,stdout,iostream,C++,Boost,Stdout,Iostream,你好 我必须使用一些外部函数(通过std::cout)为stdout生成大量调试信息。我想通过将cout重定向到boosttee\u设备,将此信息复制到某个日志文件中。我使用以下示例代码: typedef boost::iostreams::tee_device<ostream, ofstream> TeeDevice; typedef boost::iostreams::stream<TeeDevice> TeeStream; int main(int argc, c

你好

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

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();
}
typedef boost::iostreams::tee_设备tee设备;
typedef boost::iostreams::stream TeeStream;
int main(int argc,字符**argv){
删除(“file.log”);
流日志文件;
打开(“file.log”);
设备输出设备(cout,日志文件);
TeeStream记录器(输出装置);
cout.rdbuf(logger.rdbuf());

cout您将
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();
}
intmain()
{
删除(“file.log”);
流日志文件;
打开(“file.log”);

ostream tmp(cout.rdbuf());//尝试使用
freopen
函数。以下是示例和注释:

此函数对于重定向预定义流特别有用 与stdin、stdout和stderr一样,将其转换为特定文件(参见示例 下)

/*freopen示例:重定向标准输出*/
#包括
int main()
{
freopen(“myfile.txt”,“w”,stdout);
printf(“这句话被重定向到一个文件。”);
fclose(stdout);
返回0;
}

什么可怕的外部函数将日志写入cout?除了将输出从外部传输到文件之外,没有标准的方法来捕获日志。你有它的源代码吗?我有一个源代码,但不幸的是,我无法修改它。我使用的函数是粒子物理大科学框架(PandaRoot)的一部分。不幸的是,将调试信息打印到stdout是许多科学程序的常见问题(您是否检查过是否能够创建文件?
assert(logFile.good());
或类似工具?是否在调试器下运行它以查看崩溃的位置?是的,文件很好。这不是问题。我在调试器下运行过它,它显示崩溃发生在方法
boost::iostreams::flush(std::ostream)中
。复制stdout比重定向要困难得多。这只是将
stdout
替换为
myfile.txt
。OP希望写入
statdout
myfile.txt
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();
}
/* 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;
}