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

Redirecting function output to /dev/null

本文关键字:dev null 函数 输出 重定向      更新时间:2023-10-16

我正在使用一个库,它正在向coutcerr打印警告消息。我不希望这个警告消息到达我的程序的输出。我如何捕获这个输出并将其放入/dev/null或类似的?

兆瓦:

#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不能更改)


我尝试使用freopen()fclose(stdout)在这个问题中建议我如何重定向标准输出到一些可见的显示在Windows应用程序?结果是什么都不打印。

我可以建议一个hack吗?在使用标准库函数之前,在相关流上设置一个坏/失败位

#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;
}

如果你确定事情不会重定向输出(例如到/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;
}

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