我正在为自定义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字节。 我在做什么错了?