Вывод функции перенаправления на/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?. В результате ничего не печатается.
Ответы
Ответ 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;
}