【问题标题】:Suppressing cout output with in a function在函数中抑制 cout 输出
【发布时间】:2011-12-12 18:13:27
【问题描述】:

我正在使用一个共享库,其功能在任何地方都在执行 std::cout。是否可以在调用者级别做任何事情,我可以抑制 cout 输出或将其重定向到某个位置?

是否有可能在 c++ 中尝试这样的事情。

【问题讨论】:

  • 我想你可以在每次调用共享库之前和之后freopenstdout。根据您的要求,性能和线程可能是一个问题。
  • 例如,您可以使用std::cout.rdbuf() 将输出重定向到文件。
  • 此外,这个共享库看起来不像是商业质量的。如果你有这个库的源代码,你应该在禁用日志记录的情况下重新编译它。负责任的库将允许使用预处理器定义在一个地方发生这种情况。
  • @Joe 我正在尝试在我正在编写的 php 扩展中使用它。如果我为扩展定义一次,它会影响来自其他库的任何 cout。

标签: c++


【解决方案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 的方法。您遇到了以前提出的需求,因此希望其他阅读本文的人可能对创建我建议的课程有更好的想法。

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2023-03-12
    • 2013-12-15
    相关资源
    最近更新 更多