我正在寻找一个行为类似于/dev/null
的std::ostream
实现。它会忽略任何流到它的内容。在标准库或Boost中是否存在这样的东西?或者我必须自己滚?
发布于 2011-11-23 23:00:15
如果您有boost,那么在boost/iostream/device/null.hpp中有一个null ostream & istream实现。它的要点是:
#include "boost/iostreams/stream.hpp"
#include "boost/iostreams/device/null.hpp"
...
boost::iostreams::stream< boost::iostreams::null_sink > nullOstream( ( boost::iostreams::null_sink() ) );
...
发布于 2011-11-23 22:43:56
最简单的解决方案就是使用一个未打开的std::ofstream
。这将导致流中的错误状态,但大多数输出器不会检查这一点;通常的习惯用法是将检查留到结束符之后(这将把它放在您编写的代码中,您知道流应该是无效的)。
否则,实现起来非常简单:只需创建一个包含小缓冲区的streambuf
,并在overflow
中设置它(总是返回成功)。请注意,这将比未打开的文件慢;各种>>
操作符仍将执行所有转换(如果流有错误状态,则不会执行此操作)。
编辑:
class NulStreambuf : public std::streambuf
{
char dummyBuffer[ 64 ];
protected:
virtual int overflow( int c )
{
setp( dummyBuffer, dummyBuffer + sizeof( dummyBuffer ) );
return (c == traits_type::eof()) ? '\0' : c;
}
};
通常也会提供一个从istream
或ostream
派生的方便类,该类将包含它所使用的缓冲区的一个实例。大致是这样的:
class NulOStream : private NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
NulStreambuf* rdbuf() const { return this; }
};
或者,您可以只使用std::ostream
,将streambuf的地址传递给它。
发布于 2011-11-23 22:31:07
如果你在一个流上设置了badbit
,它不会输出任何东西:
#include <iostream>
int main() {
std::cout << "a\n";
std::cout.setstate(std::ios_base::badbit);
std::cout << "b\n";
std::cout.clear();
std::cout << "c\n";
}
输出:
a
c
https://stackoverflow.com/questions/8243743
复制相似问题