首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++或库中是否有空的std::ostream实现?

在C++或库中是否有空的std::ostream实现?
EN

Stack Overflow用户
提问于 2011-11-23 22:22:30
回答 8查看 28.2K关注 0票数 64

我正在寻找一个行为类似于/dev/nullstd::ostream实现。它会忽略任何流到它的内容。在标准库或Boost中是否存在这样的东西?或者我必须自己滚?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-11-23 23:00:15

如果您有boost,那么在boost/iostream/device/null.hpp中有一个null ostream & istream实现。它的要点是:

代码语言:javascript
复制
#include "boost/iostreams/stream.hpp"
#include "boost/iostreams/device/null.hpp"
...
boost::iostreams::stream< boost::iostreams::null_sink > nullOstream( ( boost::iostreams::null_sink() ) );
...
票数 28
EN

Stack Overflow用户

发布于 2011-11-23 22:43:56

最简单的解决方案就是使用一个未打开的std::ofstream。这将导致流中的错误状态,但大多数输出器不会检查这一点;通常的习惯用法是将检查留到结束符之后(这将把它放在您编写的代码中,您知道流应该是无效的)。

否则,实现起来非常简单:只需创建一个包含小缓冲区的streambuf,并在overflow中设置它(总是返回成功)。请注意,这将比未打开的文件慢;各种>>操作符仍将执行所有转换(如果流有错误状态,则不会执行此操作)。

编辑:

代码语言:javascript
复制
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;
    }
};

通常也会提供一个从istreamostream派生的方便类,该类将包含它所使用的缓冲区的一个实例。大致是这样的:

代码语言:javascript
复制
class NulOStream : private NulStreambuf, public std::ostream
{
public:
    NulOStream() : std::ostream( this ) {}
    NulStreambuf* rdbuf() const { return this; }
};

或者,您可以只使用std::ostream,将streambuf的地址传递给它。

票数 28
EN

Stack Overflow用户

发布于 2011-11-23 22:31:07

如果你在一个流上设置了badbit,它不会输出任何东西:

代码语言:javascript
复制
#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";
}

输出:

代码语言:javascript
复制
a
c
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8243743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档