将函数输出重定向到/ dev / null

时间:2011-11-23 17:13:53

标签: c++ stdout

我正在使用正在向coutcerr打印警告消息的库。我不希望此警告消息到达我的程序的输出。如何捕获此输出并将其放入/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)。结果是没有打印任何内容。

3 个答案:

答案 0 :(得分:19)

我可以建议一个黑客吗?在使用库函数之前,在相关流上设置错误/失败位。

#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 :(得分:17)

如果你确定该东西没有重定向输出(例如再次标准输出/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;
}

答案 2 :(得分:5)

使用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;
}