gpt4 book ai didi

c++ - 从 std::istreambuf_iterator<> 复制到 std::vector<>

转载 作者:太空狗 更新时间:2023-10-29 23:09:59 27 4
gpt4 key购买 nike

我有一个 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 的数组秒。因为std::basic_streambuf<>需要 std::char_traits<>模板参数,我的印象是它只能使用内置类型,如 charbyte , 而不是像 WIN32_FIND_DATA 这样的结构.正确的?

关于如何使这项工作有什么建议吗?

谢谢,保罗H

最佳答案

istreambuf_iterator 在缓冲区级别工作,它只是一个字节流。如果您想处理结构,您可能想改用 istream_iterator,并创建一个 operator>> 来读取 WIN32_FIND_DATA 结构。您还可以考虑为 WIN32_FIND_DATA 创建/使用代理。

关于c++ - 从 std::istreambuf_iterator<> 复制到 std::vector<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899707/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com