在函数中抑制cout输出

7

我正在使用一个共享库,它的函数在各个地方都有std::cout。在调用者级别上是否可以做任何事情来抑制cout输出或将其重定向到某个位置?

在C++中甚至可以尝试这样的事情吗?


2
我想你可以在每次调用共享库之前和之后使用 freopen 函数打开并关闭 stdout。具体效率和线程方面的问题则取决于你的需求。 - Joe
1
你可以使用 std::cout.rdbuf() 将输出重定向到文件。 - lapk
freopen 会影响同一进程中的所有内容的 stdout。希望这回答了你的问题。 - Joe
1
请参见https://dev59.com/1msy5IYBdhLWcg3w5CBr。 - szx
@Jithin:如果你正在编写这个扩展程序,为什么不写成不使用“cout”的形式呢? - user1084944
显示剩余3条评论
2个回答

5

像这样,只需为库调用创建函数包装器,即可重定向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 );
}

1
使用rdbuf和freeopen之间是否存在性能差异?哪种方法更好? - Jithin
@Jithin 我的理解是,cout需要在每次库函数调用之前重新定向,而不仅仅是一次。在这种情况下,我认为 rdbuf() 是最快的 - 它只是设置一个指针,在打开文件一次后就可以了。如果 cout 只需要重定向一次,那么 rdbuffreopen 两种方式本质上是相同的。 - lapk

0

您可以通过创建一个处理输出的类来过滤所有I/O。考虑到该类可能会在整个应用程序中使用,因此可能需要一个静态类,但您也可以根据需要实例化该类的实例。

除了根据参数字符串将某些内容写入或不写入cout甚至选择不同的输出之外,该类还可以根据所选输出的类型格式化文本。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接