2010-04-01 19 views
6

Bonjour Je voudrais stocker mes données dans le fichier bzip2 en utilisant Boost.IOstreams.BOOST.IOstreams: problème pour écrire à 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. 
} 
}; 

Qu'est-ce que je fais mal? J'utilise boost 1.42.0.

Cordialement Arman.

EDIT Le code fonctionne si je supprime l'option bidirectionnelle:

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

quelqu'un peut peut-être expliquer pourquoi?

+0

Le second extrait ne se compile pas non plus avec gcc. my_filter.push (std :: fstream (...)) 'aucune fonction correspondante' –

+0

@epronk: quel compilateur est-ce? J'utilise gcc 4.4.4: g ++ bz_test.cpp -I $ {BOOSTROOT}/include -L $ {BOOSTROOT}/lib -lboost_iostreams et il compile sans problème. Je viens d'éditer le post. – Arman

+0

Avez-vous trouvé la solution? Si oui, postez une réponse. – Cookie

Répondre

3

Un fstream ne peut pas être copié, vous devez donc utiliser la version de référence de poussée

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

Ainsi, votre fonction doit ressembler à quelque chose comme

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

Je suis surpris que vous compilateur permet votre code , Je pense qu'il se plaint d'une référence à temporaire ... quel compilateur utilisez-vous?

+0

@Pieter: J'utilise VC++ 2008 Express Edition: Version 9.0.30729.1 SP. Le code se compile sans aucun avertissement. Votre suggestion ne résout pas le problème. Comme auparavant, il s'arrête: void bzip2_base :: end (bool compress) dans la fonction iostreams/src/bzip2.cpp. – Arman

+2

Il me semble que vous avez atteint le point où vous devez aller à la liste de diffusion boost. –

+0

@Ben Collins: Oui, ce que j'ai fait. Merci. – Arman