我使用的是一个向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)
。结果是什么都没有打印出来。
发布于 2011-11-24 01:30:05
如果你确定这个东西不会重定向输出(例如/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;
}
发布于 2011-11-24 01:21:55
我可以推荐一种黑客方法吗?在使用库函数之前,在相关流上设置一个坏/失败位。
#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;
}
发布于 2011-11-24 01:26:53
使用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;
}
https://stackoverflow.com/questions/8246317
复制相似问题