динамическое добавление фильтров boost :: filtering_stream - PullRequest
2 голосов
/ 07 марта 2012

Я использую 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 );
}

Я вызываю readFromStream для каждого файла, используя тот же inputStream. Тем не менее, я продолжаю получать тарабарщину, даже если не использую фильтр. Когда я напрямую использую inputStream, файл читается нормально.

Что я делаю не так?

1 Ответ

0 голосов
/ 13 мая 2018

Я знаю, что это было давно, но я просто наткнулся на этот вопрос. Таким образом, ответ оказался помещением всего раздела кода в новую область видимости:

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).

...