用ostream打印到无处

scd*_*dmb 9 c++ printing stream

我想将数据发送到任何地方,我的意思是我不想在控制台或文件中打印数据,但我需要一些std::ostream对象.怎么做?

pax*_*blo 13

我用过:

std::ostream bitBucket(0);
Run Code Online (Sandbox Code Playgroud)

最近没有问题,虽然如果你从某个角度看它有一些潜在的问题(见下面的链接).

旁白:根据我的理解(我并不完全确定),上面的调用最终会调用basic_ios::init(0),因为传入的是NULL指针,它会将rdstate()函数返回的流状态设置为badbit值.

这反过来又阻止了流输出更多信息,而只是将其丢弃.

以下程序显示了它的运行情况:

#include <iostream>

int main (void) {
    std::ostream bitBucket(0);
    bitBucket << "Hello, there!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从中得到它的页面也有一个可能更清晰的解决方案(稍作修改以删除上面第一个解决方案的重复):

#include <iostream>

class null_out_buf : public std::streambuf {
    public:
        virtual std::streamsize xsputn (const char * s, std::streamsize n) {
            return n;
        }
        virtual int overflow (int c) {
            return 1;
        }
};

class null_out_stream : public std::ostream {
    public:
        null_out_stream() : std::ostream (&buf) {}
    private:
        null_out_buf buf;
};

null_out_stream cnul;       // My null stream.

int main (void) {
    std::cout << std::boolalpha;

    //testing nul

    std::cout << "Nul stream before: " << cnul.fail() << std::endl;
    cnul << "Goodbye World!" << std::endl;
    std::cout << "Nul stream after: " << cnul.fail() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*nze 5

最简单的解决方案是输出到未打开的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 == EOF) ? '\0' : c ;
    }
};
Run Code Online (Sandbox Code Playgroud)

(缓冲区将避免一些不必要的虚函数调用.在某些平台上,这会产生显着的差异.)

然后创建一个使用它的输出流:

class NulOStream : public NulStreambuf, public std::ostream
{
public:
    NulOStream() : std::ostream( this ) {}
};
Run Code Online (Sandbox Code Playgroud)

(继承的使用,而不是包含,确保streambuf在传递给之前是完全构造的ostream.这在实践中通常是不必要的,但是标准似乎没有授权将尚未构造的传递给构造streambuf函数ostream.)