我正在使用一个共享库,它的函数在各个地方都有std::cout。在调用者级别上是否可以做任何事情来抑制cout输出或将其重定向到某个位置?
在C++中甚至可以尝试这样的事情吗?
我正在使用一个共享库,它的函数在各个地方都有std::cout。在调用者级别上是否可以做任何事情来抑制cout输出或将其重定向到某个位置?
在C++中甚至可以尝试这样的事情吗?
像这样,只需为库调用创建函数包装器,即可重定向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 );
}
cout
需要在每次库函数调用之前重新定向,而不仅仅是一次。在这种情况下,我认为 rdbuf()
是最快的 - 它只是设置一个指针,在打开文件一次后就可以了。如果 cout
只需要重定向一次,那么 rdbuf
和 freopen
两种方式本质上是相同的。 - lapk您可以通过创建一个处理输出的类来过滤所有I/O。考虑到该类可能会在整个应用程序中使用,因此可能需要一个静态类,但您也可以根据需要实例化该类的实例。
除了根据参数字符串将某些内容写入或不写入cout甚至选择不同的输出之外,该类还可以根据所选输出的类型格式化文本。
我查看了ostream,并没有立即看到任何直接修改cout的方法。您遇到了以前出现过的需求,因此希望阅读此文的其他人能够对我建议的类的创建有更好的想法。
stdout
。具体效率和线程方面的问题则取决于你的需求。 - Joestd::cout.rdbuf()
将输出重定向到文件。 - lapkfreopen
会影响同一进程中的所有内容的stdout
。希望这回答了你的问题。 - Joe