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
重定向到boosttee\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;
}