Подтвердить что ты не робот

Вывод функции перенаправления на/dev/null

Я использую библиотеку, которая печатает предупреждающее сообщение на cout или cerr. Я не хочу, чтобы это предупреждающее сообщение достигло вывода моей программы. Как я могу поймать этот вывод и поместить его в /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 не следует изменять.)


Я попытался использовать freopen() и fclose(stdout), как было предложено в этом вопросе Как перенаправить stdout на какой-либо видимый экран в приложении Windows?. В результате ничего не печатается.

4b9b3361

Ответ 1

Если вы уверены, что вещь не перенаправляет вывод (например, на /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

Могу я предложить взломать? Установите бит/сбой в соответствующем потоке перед использованием библиотечной функции.

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

Ответ 3

Использовать 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;
}