Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a null std::ostream implementation in C++ or libraries?

Tags:

c++

null

ostream

I'm looking for a std::ostream implementation that acts like /dev/null. It would just ignore anything that is streamed to it. Does such a thing exist in the standard libraries or Boost? Or do I have to roll my own?

like image 565
paperjam Avatar asked Nov 23 '11 14:11

paperjam


2 Answers

If you have boost, then there's a null ostream & istream implementation available in boost/iostreams/device/null.hpp . The gist of it:

#include "boost/iostreams/stream.hpp" #include "boost/iostreams/device/null.hpp" ... boost::iostreams::stream< boost::iostreams::null_sink > nullOstream( ( boost::iostreams::null_sink() ) ); ... 
like image 75
Ylisar Avatar answered Sep 28 '22 04:09

Ylisar


The simplest solution is just to use an unopened std::ofstream. This will result in an error state in the stream, but most outputters won't check this; the usual idiom is to leave the check to the end, after the close (which would put it in code you wrote, where you know that the stream should be invalid).

Otherwise, it's pretty straight forward to implement: just create a streambuf which contains a small buffer, and sets it up in overflow (always returning success). Note that this will be slower than the unopened file, however; the various >> operators will still to all of the conversion (which they don't do if the stream has an error state).

EDIT:

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

It's usual to provide a convenience class derived from istream or ostream as well, which will contain an instance of this buffer which it uses. Something along the lines of:

class NulOStream : private NulStreambuf, public std::ostream { public:     NulOStream() : std::ostream( this ) {}     NulStreambuf* rdbuf() const { return this; } }; 

Or you can just use an std::ostream, passing the address of the streambuf to it.

like image 44
James Kanze Avatar answered Sep 28 '22 04:09

James Kanze