2011-11-23 8 views
17

Estoy utilizando una biblioteca que está imprimiendo un mensaje de advertencia en cout o cerr. No quiero que este mensaje de advertencia llegue a la salida de mi programa. ¿Cómo puedo capturar esta salida y ponerla en /dev/null o similar?Salida de la función de redireccionamiento a/dev/null

EPM:

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
}; 

int main() 
{ 
    foo(); 
    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 

La salida debe ser:

Interesting message. 

¿Cómo debería modificar main para obtener el resultado deseado? (foo no debe ser cambiado.)


He intentado utilizar freopen()fclose(stdout) y como se sugiere en esta pregunta How can I redirect stdout to some visible display in a Windows Application?. El resultado es que nada está impreso.

Respuesta

15

Si está seguro de que la cosa no redirige la salida (por ejemplo, para /dev/tty/, lo que sería estándar de salida de nuevo) (que no creo), puedes redirigir antes de llamarlos.

#include <iostream> 
#include <sstream> 

void foobar() { std::cout << "foobar!\nfrob!!"; } 

int main() {  
    using namespace std; 

    streambuf *old = cout.rdbuf(); // <-- save   
    stringstream ss; 

    cout.rdbuf (ss.rdbuf());  // <-- redirect 
    foobar();      // <-- call 
    cout.rdbuf (old);    // <-- restore 

    // test 
    cout << "[[" << ss.str() << "]]" << endl; 
} 
18

¿Puedo sugerir un truco? Establezca un bit malo/fallido en la secuencia relevante antes de usar una función de biblioteca.

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
} 

int main() 
{ 
    std::cout.setstate(std::ios::failbit) ; 
    foo(); 
    std::cout.clear() ; 
    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 
+1

Gracias esto funciona, sin embargo, he decidido marcar la otra respuesta como la respuesta aceptada. – Unapiedra

+1

Gracias @Unapiedra. Modales siempre apreciados :) – wreckgar23

+1

¿Puedo sugerir que se guarde el estado actual a través de 'rdstate' y luego reiniciarlo después? Eso es un poco más seguro que borrar el estado de la secuencia. – SirGuy

4

Use ios :: rdbuf:

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
} 

int main() 
{ 
    ofstream file("/dev/null"); 

    //save cout stream buffer 
    streambuf* strm_buffer = cout.rdbuf(); 

    // redirect cout to /dev/null 
    cout.rdbuf(file.rdbuf()); 

    foo(); 

    // restore cout stream buffer 
    cout.rdbuf (strm_buffer); 

    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 
Cuestiones relacionadas