2011-11-23 9 views
17

Sto utilizzando una libreria che sta stampando un messaggio di avviso su cout o cerr. Non voglio che questo messaggio di avviso raggiunga l'output del mio programma. Come posso prendere questo output e inserirlo in /dev/null o simile?Reindirizzamento dell'output della funzione a/dev/null

MWE:

#include <iostream> 

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

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

L'output dovrebbe essere:

Interesting message. 

Come devo modificare main per ottenere il risultato desiderato? (foo non deve essere modificato.)


Ho provato ad utilizzare freopen() e fclose(stdout) come suggerito in questa domanda How can I redirect stdout to some visible display in a Windows Application?. Il risultato è che non viene stampato nulla.

risposta

15

Se si è certi che cosa non reindirizzare l'output (ad esempio per /dev/tty/, che sarebbe standard di nuovo) (che non credo), puoi reindirizzare prima di chiamarli.

#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

Posso suggerire un trucco? Impostare un bit bad/fail sul flusso rilevante prima di utilizzare una funzione di libreria.

#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

Grazie a questo, tuttavia, ho deciso di contrassegnare l'altra risposta come risposta accettata. – Unapiedra

+1

Grazie a @Unapiedra. Le buone maniere sono sempre piaciute :) – wreckgar23

+1

Potrei suggerire di salvare lo stato corrente tramite 'rststate' e poi resettarlo in seguito? Questo è un po 'più sicuro della cancellazione dello stato del flusso. – SirGuy

4

Utilizzare 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; 
} 
Problemi correlati