在函数中抑制 cout 输出
Posted
技术标签:
【中文标题】在函数中抑制 cout 输出【英文标题】:Suppressing cout output with in a function 【发布时间】:2011-12-12 18:13:27 【问题描述】:我正在使用一个共享库,其功能在任何地方都在执行 std::cout。是否可以在调用者级别做任何事情,我可以抑制 cout 输出或将其重定向到某个位置?
是否有可能在 c++ 中尝试这样的事情。
【问题讨论】:
我想你可以在每次调用共享库之前和之后freopenstdout
。根据您的要求,性能和线程可能是一个问题。
例如,您可以使用std::cout.rdbuf()
将输出重定向到文件。
此外,这个共享库看起来不像是商业质量的。如果你有这个库的源代码,你应该在禁用日志记录的情况下重新编译它。负责任的库将允许使用预处理器定义在一个地方发生这种情况。
@Joe 我正在尝试在我正在编写的 php 扩展中使用它。如果我为扩展定义一次,它会影响来自其他库的任何 cout。
见***.com/questions/8246317/…
【参考方案1】:
类似这样,只需为您的库调用制作函数包装器,即可重定向cout
。
int main( void )
std::ofstream lStream( "garbage.txt" );
std::streambuf* lBufferOld = std::cout.rdbuf();
std::cout.rdbuf( lStream.rdbuf() );
std::cout << "Calling library function" << std::endl;
std::cout.rdbuf( lBufferOld );
std::cout << "Normal output" << std::endl;
std::cout.rdbuf( lStream.rdbuf() );
std::cout << "Calling another library function" << std::endl;
std::cout.rdbuf( lBufferOld );
std::cout << "Another normal output" << std::endl;
lStream.close();
return ( 0 );
【讨论】:
使用 rdbuf 和 freeopen 有性能差异吗?哪种方法更好? @Jithin 我的理解是cout
需要在每次库函数调用之前重定向,而不是一次。在那种情况下,rdbuf()
是最快的,我认为,它只是在打开文件一次后设置一个指针。如果cout
只需要重定向一次,那么两种方式(rdbuf
或freopen
)本质上是相同的。【参考方案2】:
您始终可以通过创建一个类来处理输出来过滤所有 I/O。鉴于该类可能在应用程序范围内使用,静态类可能是有序的,但您可以根据需要实例化该类的实例。
除了写入或不写入内容,甚至选择不同的输出,基于参数字符串,类还可以根据选择的输出类型格式化文本。
我查看了ostream 并没有看到任何可以直接修改 cout 的方法。您遇到了以前提出的需求,因此希望其他阅读本文的人可能对创建我建议的课程有更好的想法。
【讨论】:
以上是关于在函数中抑制 cout 输出的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行 IPython 的 Jupyter 中抑制输出?