2011-07-26 4 views
4

私はいくつかのクラスのデータをカスタムstd::streambufの実装にシリアル化しようとしているVisual Studio 2008 C++プロジェクトを持っています。std :: streambufにデータをシリアライズ

彼らのシリアライズとデータクラスは:

struct Header { /*...*/ }; 

inline std::ostream& operator<<(std::ostream& os, const Header& h) 
{ 
    /* serialize the members of Header here */ 
    os.write(h.some_member, sizeof(h.some_member)); 
    return os; 
} 

struct Info { /*...*/ }; 

inline std::ostream& operator<<(std::ostream& os, const Info& i) 
{ 
    /* serialize the members of Info here */ 
    return os; 
} 

ストリームバッファの実装では、I/Oバッファリングとunderflowoverflowを上書きしています。

Header h(/* some useful info */); 
Info i(/* some useful info */); 

MyStreamBuf dest; 
std::iostream my_stream(&dest); 
dest << h << i; // MyStreambuf::overflow() is never called! 

しかし、MyStreambuf::overflowが呼び出されることはありません:

class MyStreamBuf : public std::streambuf 
{ 
public: 
    MyStreamBuf() { InitBuffers(); }; 

private: 

    void InitBuffers() 
    { 
     recv_buffer_.resize(buff_size); 
     send_buffer_.resize(buff_size); 
     setg(&recv_buffer_[ 0 ], &recv_buffer_[ 0 ], &recv_buffer_[ 0 ]); 
     setp(&send_buffer_[ 0 ], &send_buffer_[ 0 ]); 
    }; 

    enum { buff_size = 512 }; 

    std::vector<char_type> recv_buffer_; 
    std::vector<char_type> send_buffer_; 

    int_type underflow() { /* ... */ }; 

    int_type overflow(char_type c) 
    { 
     *pptr() = c; 
     pbump(1); 
     // if the buffer is full, flush the data 
     if(pptr() == epptr()) 
      flush(); 
     return c; 
    }; 

    void flush() 
    { 
     std::ptrdiff_t n = pptr() - pbase(); 
     int written = /* send n bytes to the data destination */ 
     pbump(-written); 
    }; 
}; // class MyStreamBuf 

私の意図した使用法は、このようなものです。私のバッファにデータを取得するためには何が必要ですか?

おかげで、あなたはiostreamの上flush()を呼び出す(またはあなたのストリームバッファにpubsync()を呼び出す)する必要が PaulH

答えて

4

伝統的には、streambufのデストラクタで(filebufのデストラクタがclose()を呼び出すのと同じ方法で)これを行います。その場合は、破棄するだけです。

また、streambufのインスタンスを所有するiostreamを継承し、適切なときにフラッシュ/破棄されることを保証するクラスを提供するのが普通です。

+0

ありがとうございます!それはそれだった。また、私の 'setp()'は間違っていますが、それは答えに直接影響しませんでした。 – PaulH

関連する問題