美好的一天。
我必须使用一些外部函数来生成大量调试信息到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
。我怎么能得到这个?
谢谢, 斯坦尼斯
答案 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}}
答案 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;
}