2011-11-23 10 views
17

Używam biblioteki, która drukuje komunikat ostrzegawczy na cout lub cerr. Nie chcę, aby ten komunikat ostrzegawczy dotarł do wyjścia mojego programu. Jak mogę złapać to wyjście i umieścić je w /dev/null lub podobnym?Przekierowanie wyjścia funkcji do/dev/null

MWE:

#include <iostream> 

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

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

Wyjście powinno być:

Interesting message. 

Jak należy zmodyfikować main aby uzyskać pożądany wynik? (foo nie musi być zmieniana.)


Próbowałem za pomocą freopen() i fclose(stdout) jak zasugerowano w tej kwestii How can I redirect stdout to some visible display in a Windows Application?. W rezultacie nic nie jest drukowane.

Odpowiedz

15

Jeżeli jesteś pewien, że sprawa nie przekierować dane wyjściowe (np /dev/tty/, co byłoby standardowym znowu) (co nie sądzę), możesz przekierować przed wywołaniem ich.

#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

Czy mogę zaproponować hackowanie? Ustaw bit złego/błędu w odpowiednim strumieniu przed użyciem funkcji biblioteki.

#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

Dziękuję za te prace, jednak postanowiłem oznaczyć drugą odpowiedź jako zaakceptowaną odpowiedź. – Unapiedra

+1

Dzięki @Unapiedra. Maniery zawsze doceniane :) – wreckgar23

+1

Czy mogę zaproponować zapisanie bieżącego stanu przez 'rdstate', a następnie zresetowanie go do tego? To trochę bezpieczniejsze niż oczyszczanie stanu strumienia. – SirGuy

4

Stosować 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; 
} 
Powiązane problemy