我正在使用正在向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
不得更改。)
我尝试使用此问题How can I redirect stdout to some visible display in a Windows Application?中建议的freopen()
和fclose(stdout)
。结果是没有打印任何内容。
答案 0 :(得分:19)
我可以建议一个黑客吗?在使用库函数之前,在相关流上设置错误/失败位。
#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;
}
答案 1 :(得分:17)
如果你确定该东西没有重定向输出(例如再次标准输出/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 :(得分:5)
使用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;
}