Reputation: 16207
I am using a library that is printing a warning message to cout
or cerr
. I don't want this warning message to reach the output of my program. How can I catch this output and put it into /dev/null
or similar?
MWE:
#include <iostream>
void foo()
{
std::cout << "Boring message. " << std::endl;
};
int main()
{
foo();
std::cout << "Interesting message." << std::endl;
return 0;
}
The output should be:
Interesting message.
How should I modify main
to get the desired output? (foo
must not be changed.)
I tried using freopen()
and fclose(stdout)
as suggested in this question How can I redirect stdout to some visible display in a Windows Application?. The result is that nothing is printed.
Upvotes: 23
Views: 20469
Reputation: 36777
Use 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;
}
Upvotes: 8
Reputation: 1045
May I suggest a hack? Set a bad/fail bit on the relevant stream before use of a library function.
#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;
}
Upvotes: 25
Reputation: 39109
If you are sure that thing does not redirect output (e.g. to /dev/tty/
, which would be standard-out again) (which I don't think), you could redirect before calling them.
#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;
}
Upvotes: 20