动态添加boost :: filtering_stream过滤器

时间:2012-03-07 17:01:00

标签: c++ boost iostream

我使用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时,文件读取正常。

我做错了什么?

1 个答案:

答案 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)。