在函数中抑制 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 只需要重定向一次,那么两种方式(rdbuffreopen)本质上是相同的。【参考方案2】:

您始终可以通过创建一个类来处理输出来过滤所有 I/O。鉴于该类可能在应用程序范围内使用,静态类可能是有序的,但您可以根据需要实例化该类的实例。

除了写入或不写入内容,甚至选择不同的输出,基于参数字符串,类还可以根据选择的输出类型格式化文本。

我查看了ostream 并没有看到任何可以直接修改 cout 的方法。您遇到了以前提出的需求,因此希望其他阅读本文的人可能对创建我建议的课程有更好的想法。

【讨论】:

以上是关于在函数中抑制 cout 输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行 IPython 的 Jupyter 中抑制输出?

如何将“拉函数错误”消息抑制到标准输出?

抑制来自 sqlplus 输出的 CURSOR 消息

如何抑制斯坦福 NLP ColumnDataClassifier.makeClassifier() 函数的标准输出

选择性地抑制输出python [重复]

c++中用cout函数怎样实现格式输出