2011-12-12 15 views
5

Estoy usando una biblioteca compartida cuyas funciones están haciendo std :: cout en todas partes. ¿Es posible hacer algo al nivel de la persona que llama en donde puedo suprimir el anuncio o redirigirlo a algún lugar?Suprimir salida cout con en una función

Incluso es posible intentar tal cosa en C++.

+2

supongo que se podría [freopen] (http://www.cplusplus.com/reference/clibrary/cstdio/freopen/) 'stdout' antes y después de cada llamada a la biblioteca compartida. El rendimiento y el enhebrado pueden ser una preocupación según sus requisitos. – Joe

+1

Puede usar 'std :: cout.rdbuf()' para redirigir la salida a un archivo, por ejemplo. – lapk

+0

También esta biblioteca compartida no parece ser de calidad comercial. Si tiene un código fuente para esta biblioteca, debe recompilarlo con el registro deshabilitado. Una biblioteca responsable permitirá que esto suceda en un lugar utilizando una definición de preprocesador. – Joe

Respuesta

4

Algo así, simplemente haga envoltorios de funciones para sus llamadas a la biblioteca que redirigirían 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

¿hay alguna diferencia de rendimiento entre el uso de rdbuf y freeopen? ¿Cuál sería un mejor enfoque? – Jithin

+0

@Jithin Según tengo entendido, 'cout' debe redirigirse antes de cada llamada a la función de biblioteca, no solo una vez. En ese caso, 'rdbuf()' es el más rápido, creo, - simplemente establece un puntero, después de abrir el archivo una vez. Si 'cout' necesita ser redirigido solo una vez, ambas formas (' rdbuf' o 'freopen') son esencialmente las mismas. – lapk

0

Siempre puede filtrar todas las E/S creando una clase para manejar la salida. Dado que la clase podría usarse en toda la aplicación, una clase estática podría estar en orden, pero podría instanciar una instancia de la clase según sea necesario.

Además de escribir algo o no para cout o incluso elegir una salida diferente, según la cadena del argumento, la clase también puede formatear el texto en función del tipo de salida elegida.

Miré ostream y de improviso no vi ninguna manera de modificar directamente cout. Has encontrado una necesidad que ha surgido antes, así que espero que alguien más leyendo esto tenga mejores ideas para crear la clase que sugerí.