C++ “内部”;“三通”;设置

C++ “内部”;“三通”;设置,c++,visual-studio-2008,C++,Visual Studio 2008,我继承了一些非常古老的VC6.0代码,我正在升级到VS2008以构建一个64位应用程序。很久很久以前实现的一个必需特性是重写std::cout,以便它的输出同时发送到控制台窗口和文件。该实现依赖于当时ostream的VC98库实现,当然,现在VS2008已无法修复。将所有输出累积到程序终止时间,然后将其转储到文件中是合理的。在回家的路上,我使用了freopen()、setvbuf()和ios::sync_with_stdio(),但令我沮丧的是,内部库没有将其缓冲区视为环形缓冲区;相反,当它刷新

我继承了一些非常古老的VC6.0代码,我正在升级到VS2008以构建一个64位应用程序。很久很久以前实现的一个必需特性是重写std::cout,以便它的输出同时发送到控制台窗口和文件。该实现依赖于当时ostream的VC98库实现,当然,现在VS2008已无法修复。将所有输出累积到程序终止时间,然后将其转储到文件中是合理的。在回家的路上,我使用了freopen()、setvbuf()和ios::sync_with_stdio(),但令我沮丧的是,内部库没有将其缓冲区视为环形缓冲区;相反,当它刷新到输出设备时,它会在开始时重新启动,因此每次刷新都会清除所有累积的输出。转换为更标准的日志功能是不可取的,因为“std::cout的使用次数超过1600次。您可以使用预处理器:

#define cout MyLogger

注入新代码。

您可以编写一个自定义流缓冲区,并使用
cout.rdbuf()
将其附加到
cout
。然后,您的自定义流缓冲区会将数据连接到
cout
的原始流缓冲区,以及从相应的
流中窃取的流缓冲区

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

对于您的teeing stream buffer,您可以从中获得灵感。

这看起来像是运算符Undefined symbol
std::MyLogger的变体。是的,这看起来很有希望。我应该很快就会知道这对我是否有效。谢谢。这很有效。我没有足够的排名来给您一个“UP”“回复,但请接受我的感谢。