c++ - 内部 "Tee"设置

标签 c++ visual-studio-2008

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

关于如何实现这一点有什么想法吗?

最佳答案

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

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

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

关于c++ - 内部 "Tee"设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2998952/

相关文章:

c++ - 哪种类型特征表明该类型是 memcpy 可分配的? (元组,对)

c++ - 我应该将 Vector<> 声明为 Vector<>* 吗?

visual-studio-2008 - 更改Windows Mobile 5.0模拟器RAM大小

c++ - N 体模拟不起作用

c++ - 如何在 hp-ux 中使用 gcc 创建共享库?

asp.net - 为什么我的 asp.net mvc 发布不再工作?

c# - Ctrl+R,Ctrl+R 命令不起作用

visual-studio-2008 - 在本地开发环境上运行 Azure 应用程序变得非常慢

c++ - 在 T 不是字符类型的情况下, basic_string<T> 有什么用吗?

visual-studio-2008 - Visual Studio 2008 保持在 "Updating Intellisense"并卡住,即使更改一个字符也是如此