копирование из std :: istreambuf_iterator <> в std :: vector <> - PullRequest
3 голосов
/ 24 мая 2010

У меня есть приложение 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.Правильный?

Какие-нибудь предложения о том, как сделать эту работу?

Спасибо, PaulH

1 Ответ

1 голос
/ 24 мая 2010

istreambuf_iterator работает на уровне буфера, где это просто поток байтов. Если вы хотите иметь дело со структурами, вы, вероятно, хотите вместо этого использовать istream_iterator и создать operator>> для чтения структур WIN32_FIND_DATA. Вы также можете подумать о создании / использовании прокси для WIN32_FIND_DATA.

...