2011-11-23 18 views
17

警告メッセージをcoutまたはcerrに出力しているライブラリを使用しています。私はこの警告メッセージを私のプログラムの出力に届かせたくありません。この出力をキャッチして/dev/nullまたは類似のものに入れるにはどうすればよいですか?関数出力を/ dev/nullにリダイレクト

MWE:

#include <iostream> 

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

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

出力は次のようになります。

Interesting message. 

どのようにして所望の出力を得るためにmainを変更する必要がありますか? (fooを変更してはいけません。)


この質問How can I redirect stdout to some visible display in a Windows Application?で提案されているように私はfreopen()fclose(stdout)を使用してみました。その結果、何も印刷されません。

答えて

15

あなたはそのことが(再び、標準アウトされるであろう、例えば/dev/tty/に)出力をリダイレクトしないことを確認している場合(私は考えていないいます)、それらを呼び出す前にリダイレクトすることができます。

#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

ハッキングを提案してもよいですか?ライブラリ関数を使用する前に、該当するストリームに不良/不良ビットを設定してください。

#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

はこの作品をありがとう、しかし、私は受け入れ答えとして、他の答えをマークすることに決めました。 – Unapiedra

+1

ありがとう@Unapiedra。マナーはいつも高く評価されています:) – wreckgar23

+1

'rdstate'で現在の状態を保存し、その後にそれをリセットすることをお勧めしますか?ストリームの状態をクリアするよりも少し安全です。 – SirGuy

4

使用イオス:: 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; 
} 
関連する問題