BOOST.IOstreams: проблемы с записью в bzip2

Здравствуйте, я хотел бы сохранить свои данные в файле bzip2, используя Boost.IOstreams.

void test_bzip()
{
namespace BI = boost::iostreams;
{
string fname="test.bz2";
  {
    BI::filtering_stream<BI::bidirectional> my_filter; 
    my_filter.push(BI::combine(BI::bzip2_decompressor(), BI::bzip2_compressor())) ; 
    my_filter.push(std::fstream(fname.c_str(), std::ios::binary|std::ios::out)) ; 
    my_filter << "test" ; 

    }//when my_filter is destroyed it is trowing an assertion.
}
};

Что я делаю неправильно? Я использую буст 1.42.0.

с уважением Арман.

EDIT Код работает, если я удалю двунаправленный параметр:

#include <fstream> 
#include <iostream> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/bzip2.hpp> 
#include <boost/iostreams/device/file.hpp> 
#include <boost/iostreams/filtering_stream.hpp>
#include <string>



void test_bzip()
{
        namespace BI = boost::iostreams;
        {
                std::string fname="test.bz2";
                {
                        std::fstream myfile(fname.c_str(), std::ios::binary|std::ios::out); 
                        BI::filtering_stream<BI::output> my_filter; 
                        my_filter.push(BI::bzip2_compressor()) ; 
                        //my_filter.push(std::fstream(fname.c_str(), std::ios::binary|std::ios::out)) ; //this line will work on VC++ 2008 V9 but not in G++ 4.4.4
                        my_filter.push(myfile);
                        my_filter << "test";
                }
        }
};

может кто объяснит почему?


person Arman    schedule 01.04.2010    source источник
comment
Второй фрагмент также не компилируется с помощью gcc. my_filter.push(std::fstream(...)) 'нет подходящей функции'   -  person Eddy Pronk    schedule 05.04.2010
comment
@epronk: что это за компилятор? Я использую gcc 4.4.4: g++ bz_test.cpp -I${BOOSTROOT}/include -L${BOOSTROOT}/lib -lboost_iostreams, и он компилируется без проблем. Я только что отредактировал сообщение.   -  person Arman    schedule 05.04.2010
comment
Вы решили это? Если это так, пожалуйста, напишите ответ.   -  person Cookie    schedule 02.09.2011
comment
@Cookie: Посмотрите на РЕДАКТИРОВАТЬ, это работает.   -  person Arman    schedule 02.09.2011


Ответы (1)


fstream нельзя скопировать, поэтому вы должны использовать эталонную версию push

template<typename StreamOrStreambuf>
void push( StreamOrStreambuf& t,
           std::streamsize buffer_size = default value,
           std::streamsize pback_size = default value );

Итак, ваша функция должна выглядеть примерно так

std::fstream theFile(fname.c_str(), std::ios::binary | std::ios::out);
// [...]
my_filter.push(theFile) ; 

Я удивлен, что ваш компилятор разрешает ваш код, я думаю, он жалуется на ссылку на временный... какой компилятор вы используете?

person Pieter    schedule 01.04.2010
comment
@Pieter: я использую экспресс-выпуск VC++ 2008: версия 9.0.30729.1 SP. Код компилируется без каких-либо предупреждений. Ваше предложение не решает проблему. Как и прежде, он останавливается в: void bzip2_base::end(bool compress) в функции iostreams/src/bzip2.cpp. - person Arman; 01.04.2010
comment
Мне кажется, вы достигли того момента, когда вам нужно перейти к спискам рассылки boost. - person Ben Collins; 07.04.2010
comment
@Бен Коллинз: Да, я так и сделал. Спасибо. - person Arman; 08.04.2010