我有一个Visual Studio 2008 C ++应用程序,我希望将流视为一组迭代器。
例如,如果我要在流上接收一个WIN32_FIND_DATA结构数组,我希望能够做到这样的事情:
IStreamBuf< WIN32_FIND_DATA > sb( stream );
std::vector< WIN32_FIND_DATA > buffer;
std::copy( std::istreambuf_iterator< WIN32_FIND_DATA >( &sb ),
std::istreambuf_iterator< WIN32_FIND_DATA >(),
std::back_inserter( buffer ) );
为实现这一目标,我定义了一个派生自std::basic_streambuf<>
的类:
template< typename T >
class IStreamBuf : public std::basic_streambuf< byte >
{
public:
IStreamBuf( IStream* stream ) : stream_( stream )
{
};
protected:
virtual traits_type::int_type underflow()
{
DWORD bytes_read = 0;
HRESULT hr = stream_->Read( &buffer_, sizeof( T ), &bytes_read );
if( FAILED( hr ) )
return traits_type::eof();
traits_type::char_type* begin =
reinterpret_cast< traits_type::char_type* >( &buffer_ );
setg( begin, begin, begin + bytes_read );
return traits_type::to_int_type( *gptr() );
};
private:
// buffer to hold current item of type T
T buffer_;
// stream used to receive data
IStream* stream_;
}; // class IStreamBuf
我无法弄清楚的是如何优雅地从byte
s数组转换为WIN32_FIND_DATA
s数组。由于std::basic_streambuf<>
需要std::char_traits<>
模板参数,因此我认为它只能使用char
或byte
等内置类型,而不是WIN32_FIND_DATA
之类的结构1}}。正确?
有关如何使这项工作的任何建议?
谢谢, PaulH
答案 0 :(得分:1)
istreambuf_iterator
在缓冲级别工作,它只是一个字节流。如果您想处理结构,可能需要使用istream_iterator
,并创建operator>>
来阅读WIN32_FIND_DATA
结构。您还可以考虑为WIN32_FIND_DATA
创建/使用代理。