ifstream的streambuf不返回最后一个数据块

时间:2019-10-03 09:04:24

标签: c++ ifstream streambuf

我正在为自定义ifstream实现streambuf,它将对数据进行解码。它包装了std :: ifstream,并在何时使用自定义谓词类转换读取的数据。 “ sink_”是std :: ifstream的数据流。

class align_streambuf :
public std::basic_streambuf<Elem, Tr>
{
public:
    align_streambuf( std::streambuf* sink, size_t buffer_size, Transform&& transform ) : sink_( *sink ), m_buffer( buffer_size, 0 ), buffer_size_( buffer_size ), transform_( std::move( transform ) )
    {
        // Input buffer
         this->setg( &(m_buffer[0]), &(m_buffer[m_buffer.size()-1]), &(m_buffer[m_buffer.size() - 1]) );
    };

    int underflow()
    {
        size_t read = sink_.sgetn( &m_buffer[0] , buffer_size_ );

        if( read )
        {
            transform_.transform( m_buffer, read );

            this->setg( &(m_buffer[0]), &(m_buffer[0]), &(m_buffer[0]) + read );
        } else
        {
           return std::ifstream::traits_type::eof();
        }

        return std::ifstream::traits_type::to_int_type( *this->gptr() );
    }
    ....
private:
    Transform transform_;
    std::streambuf& sink_;
    std::vector<char> m_buffer;
    uint64_t buffer_size_;

我无法解决的问题是最后一次阅读。当我读取文件时,最后没有完整的数据块就没来了。

XTSDecoder xtsDecoder( key.c_str() );
align_ifstream<XTSDecoder, 1024> stream2( "test.txt", std::move( xtsDecoder ) );

char data2[3000];
while( stream2.read( data2, 3000 ) )
{
    std::cout << "Read: " << stream2.gcount() << std::endl;
}

因此,如果文件大小为13000字节,则我将接收到完整的12000字节,并且所有连续读取均返回0。我确实收到了对最后1000个字节的取消流调用,我确实看到为此调用了transform,而setg为以适当的偏移量调用。但是由于某种原因,read()返回0字节。 我在做什么错了?

0 个答案:

没有答案