3

我有一个 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

我想不通的是如何优雅地从 s 数组转到bytes 数组WIN32_FIND_DATA。因为std::basic_streambuf<>需要一个std::char_traits<>模板参数,我的印象是它只能使用内置类型,如charor byte,而不是结构如WIN32_FIND_DATA. 正确的?

关于如何使这项工作的任何建议?

谢谢,保罗

4

1 回答 1

1

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

于 2010-05-24T19:41:29.590 回答