美好的一天。
我必须使用一些外部函数来向 stdout 生成大量调试信息(通过 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
。我怎样才能获得这个?
谢谢, 斯坦尼斯拉夫
最佳答案
您将 TeeDevice
输出设置为 std::cout
,然后将其 rdbuf
替换为依赖于 TeeDevice
的输出code> (取决于 std::cout
)。
通过临时 std::ostream
打破该循环来解决问题,该临时 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();
}
关于C++ 通过重定向 cout 将 stdout 复制到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641190/