定制 C++ cout 类 - 输出到控制台和日志文件
我正在开发一个大量使用“cout << strSomething;”的程序将信息记录到控制台。我需要修改程序,以便所有控制台输出都到达控制台和文件。虽然我可以修改“cout <<”在我们的代码中,有几个大型第三方库也使用“cout <<”;这些库由于其许可证而无法修改 - 因此修改对“cout <<”的所有引用不是一个解决方案。此外,由于命令行的执行方式,无法使用“wtee.exe”。
我使用的是 Visual Studio 2008。我在 Google 网上论坛:将 cout 重定向到文件< 中看到了该帖子< /a>,这似乎正是我想做的。唯一的问题是代码无法编译。我在 ->overflow() 和 ->sync() 方法调用上收到 C2248 错误“无法访问受保护的成员”。
有人知道如何编译这段代码吗?或者同时将 cout 重定向到控制台和文件的替代方法?
I'm working on a program that makes heavy use of "cout << strSomething;" to log information to the console. I need to modify the program so that all console output goes to both the console AND a file. Although I can modify the "cout <<" in our code, there are several large third party libraries that also use "cout <<"; those libraries cannot be modified due to their licenses - so modifying all references to "cout <<" is not a solution. Also, the use of "wtee.exe" isn't possible due to the manner in which the command lines are executed.
I am using Visual Studio 2008. I've seen the posting at Google Groups: redirect cout to file, which appears to do EXACTLY what I want to do. The only problem is that the code won't compile. I get C2248 errors "cannot access protected member" on the ->overflow() and ->sync() method calls.
Would anyone know how to get this code to compile? Or an alternate way of redirecting cout to both console and file simultaneously?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
boost::iostreams: :tee_device
是为此示例调用而创建的:
The
boost::iostreams::tee_device
is made for thissample invocation:
这很容易扩展到其他流。
OstreamFork.hpp -- 同时将数据分发到 2 个流
TestOstreamFork.cpp:
输出到 cout 和 test2.txt:
This easily extends to additional streams.
OstreamFork.hpp -- Distribute data to 2 streams simultaneously
TestOstreamFork.cpp:
Output to both cout and test2.txt:
如果你绝望了:
这是一个粗俗的黑客,但它通常有效。
if you're desperate:
this is a gross hack, but it usually works.
sync
调用可以替换为pubsync
。至于overflow
调用,我认为这可能是一个拼写错误。因为看起来应该是对 sputc 的调用。The
sync
calls can be replaced withpubsync
. As for theoverflow
call I think that may be a typo. as it looks as if it should be a call tosputc
.您可以做的是使用指向
std::streambuf
的指针捕获std::cout.rdbuf()
,那么我认为您应该能够将所有输出写入 std::cout 到某个文件。
What you can do is capture the
std::cout.rdbuf()
with a pointer tostd::streambuf
,then i think you should be able to write all the outputs to
std::cout
to some file.您可以使用包装器类来执行此操作,像这样
声明 cout ,然后更改所有
#include
以包含此包装器(请记住 cout 是外部变量,因此您必须也在您的源代码之一中解密它)。you can just use a wrapper class to do so, somthing like this
declare cout like that and just change all your
#include <iostream>
to include this wrapper (remeber cout is external variable so you have to declere it in one of your source codes too).抱歉这么晚才热身,但这应该是一个基于 Dietmar Kühl 在 Google 群组上的解决方案将 cout 重定向到 teebuffer 的解决方案。
用法很简单
在对象“log”的生命周期中,所有内容都将写入 cout/cerr 和文件
https://sourceforge.net/p/getset/code/ci/master/tree/GetSet/GetSetLog.hxx
Sorry to warm this up so late, but this here should be a solution with redirection of cout to a teebuffer based on Dietmar Kühl's solution on Google groups.
Usage is simply
During the lifetime of the object "log" everything will be written to both cout/cerr and file
https://sourceforge.net/p/getset/code/ci/master/tree/GetSet/GetSetLog.hxx