私はいくつかのクラスのデータをカスタム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バッファリングとunderflow
とoverflow
を上書きしています。
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
ありがとうございます!それはそれだった。また、私の 'setp()'は間違っていますが、それは答えに直接影響しませんでした。 – PaulH