我使用boost::iostreams filtering_stream来实现我的自定义存档格式。此格式应支持各种压缩算法,以便可以使用不同的方法压缩每个文件。
为此,我保留了一个用于阅读(或写入)的全局流,并根据需要添加或删除过滤器。然而,目前还不清楚是否实际上可以实时添加和删除过滤器。
从本质上讲,我试图做这样的事情:
void ArchiveFile::readFromStream( std::istream& inputStream, unsigned filters )
{
// create the filtered stream
boost::iostreams::filtering_istream in;
if ( filters & FILTERS_BZIP )
{
in.push( boost::iostreams::bzip2_decompressor() );
}
// add the source stream
in.push( inputStream );
// read file content
in.read( &mFileContent[0], mFileSize );
}
我使用相同的inputStream为每个文件调用readFromStream。然而,即使不使用任何过滤器,我仍然会以这种方式变得胡言乱语。当我直接使用inputStream时,文件读取正常。
我做错了什么?
答案 0 :(得分:0)
我知道已经有一段时间了,但我只是偶然发现了这个问题。所以答案结果是将整个代码部分放在一个新的范围内:
void ArchiveFile::readFromStream( std::istream& inputStream, unsigned filter
{
// new scope
{
// create the filtered stream
boost::iostreams::filtering_istream in;
if ( filters & FILTERS_BZIP )
{
in.push( boost::iostreams::bzip2_decompressor() );
}
// add the source stream
in.push( inputStream );
// read file content
in.read( &mFileContent[0], mFileSize );
}
}
这可能是必要的,因为我当时使用的编译器中存在一些错误(某些版本的MS Visual Studio)。