【发布时间】:2013-11-07 14:27:57
【问题描述】:
美好的一天。
我必须使用一些外部函数来生成大量调试信息到标准输出(通过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。我怎样才能得到这个?
谢谢, 斯坦尼斯拉夫
【问题讨论】:
-
什么可怕的外部函数将日志写入 cout ?除了将输出通过外部管道传输到文件之外,没有标准的方法来捕获它。你有它的源代码吗?
-
我有一个来源,但很遗憾,我无法修改它。我使用的函数是粒子物理学大科学框架 (PandaRoot) 的一部分。不幸的是,仅将调试信息打印到
stdout是许多科学程序的常见问题( -
您是否检查过您是否能够创建该文件?
assert(logFile.good());或类似的?您是否在调试器下运行过它以查看崩溃的位置? -
是的,文件很好。这不是问题。
-
我已经在调试器下运行它,它显示在方法
boost::iostreams::flush(std::ostream)中发生了崩溃。