用ostream打印到无处

时间:2011-10-19 08:15:46

标签: c++ printing stream

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

5 个答案:

答案 0 :(得分:12)

我用过:

std::ostream bitBucket(0);

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

  

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

     

这反过来阻止了流输出更多信息,而只是将其扔掉。

以下程序显示了它的实际效果:

#include <iostream>

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

The page where I got it from也将此作为一种可能更清晰的解决方案(稍作修改以删除上述第一个解决方案的重复):

#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;
}

答案 1 :(得分: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 ;
    }
};

(缓冲区将避免一些不必要的虚函数调用。在某些情况下 平台,这会产生重大影响。)

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

class NulOStream : public NulStreambuf, public std::ostream
{
public:
    NulOStream() : std::ostream( this ) {}
};

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

答案 2 :(得分:2)

最简单的解决方案:使用std::stringstream

#include <sstream>
#include <iostream>

void func(std::ostream& o){
    o << "blatest\n";
}

int main(){
    std::stringstream black_hole;
    func(std::cout);
    func(black_hole);
}

stringstream将包含输出,但是如果你不使用它,它就像它从未被填充一样。

答案 3 :(得分:0)

这里有一些建议http://bytes.com/topic/c/answers/589209-std-null-stream

该网站的一个很好的答案

使用普通的std :: fstream,只打开它来写入所需的文件 “的/ dev / null的”。它应该工作。

如果你真的想创建自己的流,只需从中派生出来 basic_ostream并简单地定义您自己的运算符&lt;&lt;是功能 它只返回流引用。你将不得不写假 'write'和'put'方法也是(以及所有其他输出方法)。

事实上,

#include <streambuf>
#include <ostream>

template <class cT, class traits = std::char_traits<cT> >
class basic_nullbuf: public std::basic_streambuf<cT, traits> {
typename traits::int_type overflow(typename traits::int_type c)
{
return traits::not_eof(c); // indicate success
}
};

template <class cT, class traits = std::char_traits<cT> >
class basic_onullstream: public std::basic_ostream<cT, traits> {
public:
basic_onullstream():
std::basic_ios<cT, traits>(&m_sbuf),
std::basic_ostream<cT, traits>(&m_sbuf)
{
init(&m_sbuf);
}

private:
basic_nullbuf<cT, traits> m_sbuf;
};

typedef basic_onullstream<char> onullstream;
typedef basic_onullstream<wchar_t> wonullstream;

来自http://bytes.com/topic/c/answers/428285-null-ostream

答案 4 :(得分:0)

由于没有人提及它,如果它是关于抑制标准输出或错误输出,您只需关闭相应的文件描述符(例如fclose (stdout)fclose (stderr))。 这会使一切变得清晰,包括printffprintf (stderr, ...)之类的内容 所以你确实会继续使用通常的coutcerr,但它们会变成比特桶。