2017-10-13 172 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

請記住,cout是緩衝的,而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

EDITED澄清

fd傳遞給resume_stdout是你作爲supress_stdout的返回值收到了同樣的一個。

+0

你傳遞了​​什麼參數fd? – tyebillion

+1

@tyebillion,你從'suspend_stdout'得到的int –

+0

是的,那對我有效。我只需#include 即可獲得O_WRONLY的定義。 – tyebillion