c++ - файл - перенаправление ввода вывода си



Перенаправление вывода функции в/dev/null (2)

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


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

Answer #2

Используйте 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;
}




stdout