从 std::istreambuf_iterator<> 复制到 std::vector<>
我有一个 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
数组转换为 WIN32_FIND_DATA
数组。因为 std::basic_streambuf<>
需要 std::char_traits<>
模板参数,所以我的印象是它只能使用内置类型,例如char
或 byte
,而不是像 WIN32_FIND_DATA
这样的结构。正确的?
关于如何开展这项工作有什么建议吗?
谢谢, 保罗·H
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
istreambuf_iterator
在缓冲区级别工作,它只是一个字节流。如果您想处理结构,您可能需要使用istream_iterator
来代替,并创建一个operator>>
来读取WIN32_FIND_DATA
结构。您还可以考虑为WIN32_FIND_DATA
创建/使用代理。An
istreambuf_iterator
works at the buffer level, where it's just a stream of bytes. If you want to deal with structures, you probably want to use anistream_iterator
instead, and create anoperator>>
to read theWIN32_FIND_DATA
structures. You might also consider creating/using a proxy for theWIN32_FIND_DATA
.