用ostream打印到任何地方



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

我使用过:

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

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

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

最简单的解决方案就是输出到未打开的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) ? '' : c ;
    }
};

(缓冲区将避免一些不必要的虚拟函数调用平台,这会产生显著差异。(

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

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

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

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

#include <sstream>
#include <iostream>
void func(std::ostream& o){
    o << "blatestn";
}
int main(){
    std::stringstream black_hole;
    func(std::cout);
    func(black_hole);
}

stringstream将包含输出,但如果您不使用它,它就和从未填充过一样。

由于没有人提到它,如果是关于抑制std或错误输出,您可以简单地关闭相应的文件描述符(例如fclose (stdout)fclose (stderr)(
这将关闭所有内容,包括printffprintf (stderr, ...)
因此,您确实会继续使用通常的coutcerr,但它们会变成比特桶。

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

来自该网站的一个好答案:

使用普通std::fstream,打开它仅用于写入所需文件"dev/null";。它应该起作用。

如果您真的想创建自己的流,只需从basic_ stream并简单地定义您自己的运算符<lt;发挥作用其仅返回流引用。你必须写dummy"write"one_answers"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

相关内容

  • 没有找到相关文章

最新更新