gpt4 book ai didi

c++ - 内部 "Tee"设置

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:32 26 4
gpt4 key购买 nike

我继承了一些非常古老的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com