2017-10-13 10 views
3

私は、私は興味がない(おそらくのprintfを使用して)いくつかのメッセージを出力ライブラリ関数を呼び出しています:printfからの出力を一時的に抑制する方法は?コンソールアプリケーションで

void libFoo() 
{ 
    // does some stuff 
    printf("boring message"); 
    // does some more stuff 
} 

私が思うに、なぜ私はそれゆえ、動作しませんでした前に、coutのを抑制しようとしましたlibFooはprintfを使用しています:

cout << "interesting messsage" << endl; 
streambuf* orig_buf = cout.rdbuf(); 
cout.rdbuf(NULL); 
libFoo(); 
cout.rdbuf(orig_buf); 
cout << "another interesting messsage" << endl; 

これらのメッセージはすべて出力されます。 printfからの出力を一時的に抑制する方法はありますか?私はLinux Mintを使用しています。

+0

printf libコールを上書きする可能性があります。 – Stargateur

+1

できますが、私はあなたが完全に移植できるとは思いません。 freopen関数とdup関数を見てください。 – Xarn

+1

curはバッファされず、cerrはバッファされません。無効にした場合は、バッファがフラッシュされていることを確認してください。 – harper

答えて

1

ここにある:

int supress_stdout() { 
    fflush(stdout); 

    int ret = dup(1); 
    int nullfd = open("/dev/null", O_WRONLY); 
    // check nullfd for error omitted 
    dup2(nullfd, 1); 
    close(nullfd); 

    return ret; 
} 

void resume_stdout(int fd) { 
    fflush(stdout); 
    dup2(fd, 1); 
    close(fd); 
} 

これはC++である場合、また、良好な測定のためのcoutをフラッシュします。

fdあなたはresume_stdoutに渡すが、あなたがsupress_stdoutの戻り値として受け取ったものと同じであると明確にするために編集しました。

+0

パラメータfdには何を渡しますか? – tyebillion

+1

@tyebillion、あなたが 'suspend_stdout'から得たint –

+0

それは私のために働いた。私はちょうどO_WRONLYの定義を取得するために#を含める必要があった。 – tyebillion

関連する問題