内部“Tee”设置

时间:2010-06-08 15:48:29

标签: c++ visual-studio-2008

我继承了一些非常旧的VC6.0代码,我正在升级到VS2008以构建64位应用程序。很久很久以前实现的一个必需功能是覆盖std :: cout,因此它的输出同时进入控制台窗口和文件。实现依赖于当时的ostream VC98库实现,当然,现在VS2008已经无法挽回地破坏了它。在程序终止时间之前累积所有输出然后将其转储到文件中是合理的。我通过使用freopen(),setvbuf()和ios :: sync_with_stdio()获得了回家的一部分,但令我沮丧的是,内部库不会将其缓冲区视为环形缓冲区;相反,当它刷新到输出设备时,它会在开始时重新启动,因此每次刷新都会清除所有累积的输出。转换为更标准的日志记录功能是不可取的,因为在大约60个文件中分散了超过1600个“std :: cout<<”的用法。我考虑过覆盖ostream的运算符<<功能,但我不确定这是否会覆盖我,因为有全局运算符<<无法覆盖的函数。 (或者他们可以吗?)

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:3)

您可以编写自定义流缓冲区,并使用cout将其附加到cout.rdbuf()。然后,您的自定义流缓冲区会将数据传输到cout的原始流缓冲区以及从适当的ofstream中窃取的流缓冲区。

ofstream flog("log.txt");
teebuf tb(flog.rdbuf(), cout.rdbuf());
cout.rdbuf(&tb);

对于您的发球流缓冲区,您可以从this page获得灵感。

答案 1 :(得分:-1)

您可以使用预处理器:

#define cout MyLogger

注入新代码。