std::ostream
のように動作する実装を探してい/dev/null
ます。ストリーミングされたものはすべて無視します。そのようなものは標準ライブラリまたはBoostに存在しますか? それとも自分で巻く必要がありますか?
9 に答える
ブーストがある場合は、boost / iostreams / device/null.hppにnullostreamとistreamの実装があります。その要点:
#include "boost/iostreams/stream.hpp"
#include "boost/iostreams/device/null.hpp"
...
boost::iostreams::stream< boost::iostreams::null_sink > nullOstream( ( boost::iostreams::null_sink() ) );
...
最も簡単な解決策は、未開封の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 == traits_type::eof()) ? '\0' : c;
}
};
通常は、istream
またはから派生した便利なクラスを提供ostream
します。これには、使用するこのバッファーのインスタンスが含まれます。次のようなもの:
class NulOStream : private NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
NulStreambuf* rdbuf() const { return this; }
};
std::ostream
または、ストリームバッファのアドレスを渡して を使用することもできます。
ストリームに設定badbit
すると、何も出力されません。
#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";
}
出力:
a
c