2010-04-01 9 views
6

Witam Chciałbym zapisać moje dane w pliku bzip2 za pomocą Boost.IOstreams.BOOST.IOstreams: problemy z pisaniem do bzip2

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. 
} 
}; 

Co robię źle? Używam doładowania 1.42.0.

Pozdrawiam Arman.

EDIT Kod działa, jeśli mogę usunąć opcję dwukierunkowego:

#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"; 
       } 
     } 
}; 

może ktoś może wyjaśnić, dlaczego?

+0

Drugi fragment również nie jest kompilowany z gcc. my_filter.push (std :: fstream (...)) "brak pasującej funkcji" –

+0

@epronk: jaki to kompilator? Używam gcc 4.4.4: g ++ bz_test.cpp -I $ {BOOSTROOT}/include -L $ {BOOSTROOT}/lib -lboost_iostreams i kompiluje bez problemu. Właśnie edytowałem post. – Arman

+0

Rozwiązałeś to? Jeśli tak, proszę zamieścić odpowiedź. – Cookie

Odpowiedz

3

fstream nie mogą być kopiowane, więc trzeba użyć wersji referencyjnej naciśnięciem

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

Więc funkcja powinna wyglądać mniej więcej tak

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

Jestem zaskoczony you kompilator pozwala swój kod , Myślę, że narzeka na odwołanie do tymczasowego ... którego kompilatora używasz?

+0

@Pieter: Używam wersji VC++ 2008 Express: Wersja 9.0.30729.1 SP. Kod kompiluje się płynnie bez żadnego ostrzeżenia. Twoja sugestia nie rozwiązuje problemu. Tak jak poprzednio, zatrzymuje się w: void bzip2_base :: end (bool compress) w funkcji iostreams/src/bzip2.cpp. – Arman

+2

Wygląda na to, że dotarłeś do punktu, w którym musisz udać się na listy dyskusyjne doładowania. –

+0

@Ben Collins: Tak, to co zrobiłem. Dzięki. – Arman