1

以下のコードが、コンパイラによるバッファの自動フラッシュを停止しないのはなぜですか?

cout.sync_with_stdio(false);
cin.tie(nullptr);
cout << "hello";
cout << "world";
int a;
cin >> a;

出力:

helloworld

Visual Studio 2012 Ultimate を使用しています

4

2 に答える 2

1

標準では、必要に応じていつでも実装をフラッシュできますが、実装の品質の観点からは、ここでフラッシュを期待することはできません。を追加して、指定したバッファを使用するようsetbufに指示することもできます:std::cin

std::cout.rdbuf()->setbuf( buffer, sizeof(buffer) );

繰り返しますが、標準は何も保証しませんが、これが尊重されない場合、バグレポートを正当化するのに十分なほど品質が悪いと考えます.

最後に、さらに悪化した場合は、必要なバッファリングを行うフィルタリング streambuf をいつでも挿入できます。する必要はありませんが、コンパイラやライブラリの品質の欠如を回避するために追加のコードを書かなければならなかったのはこれが初めてではありません。あなたがしているのは単純な出力だけである場合(シークなどはありません)、次のようなものがうまくいくはずです:

class BufferingOutStreambuf : public std::streambuf
{
    std::streambuf* myDest;
    std::ostream* myOwner;
    std::vector<char> myBuffer;

    static size_t const bufferSize = 1000;
protected:
    virtual int underflow( int ch )
    {
        return sync() == -1 
            ? EOF
            : sputc( ch );
    }
    virtual int sync()
    {
        int results = 0;
        if ( pptr() != pbase() ) {
            if ( myDest->sputn( pbase(), pptr() - pbase() )
                    != pptr() - pbase() ) {
                results = -1;
            }
        }
        setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
        return results;
    }
public:
    BufferingOutStreambuf( std::streambuf* dest )
        : myDest( dest )
        , myOwner( NULL )
        , myBuffer( bufferSize )
    {
        setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
    }

    BufferingOutStreambuf( std::ostream& dest )
        : myDest( dest.rdbuf() )
        , myOwner( &dest )
        , myBuffer( bufferSize )
    {
        setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
        myOwner->rdbuf( this );
    }

    ~BufferingOutStreambuf()
    {
        if ( myOwner != NULL ) {
            myOwner->rdbuf( myDest );
        }
    }
};

次に、次のようにします。

BufferingOutStreambuf buffer( std::cout );

の最初の行としてmain(iostream は、バッファリングとコード変換のために streambuf をフィルタリングして、最初からこのように動作するように設計されるべきだったと主張することができます。しかし、そうではありませんでした。適切な実装では、これは必要ないはずです。)

于 2013-08-01T08:54:26.220 に答える