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