66

std::ostreamのように動作する実装を探してい/dev/nullます。ストリーミングされたものはすべて無視します。そのようなものは標準ライブラリまたはBoostに存在しますか? それとも自分で巻く必要がありますか?

4

9 に答える 9

28

ブーストがある場合は、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() ) );
...
于 2011-11-23T15:00:14.523 に答える
28

最も簡単な解決策は、未開封の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または、ストリームバッファのアドレスを渡して を使用することもできます。

于 2011-11-23T14:43:56.183 に答える
22

ストリームに設定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
于 2011-11-23T14:31:07.303 に答える