2010-04-01 9 views
6

Hola, me gustaría almacenar mis datos en el archivo bzip2 utilizando Boost.IOstreams.BOOST.IOstreams: problemas para escribir en 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é estoy haciendo mal? Estoy usando boost 1.42.0.

saludos cordiales Arman.

EDITAR El código está trabajando si quito la opción bidireccional:

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

tal vez alguien puede explicar por qué?

+0

El segundo fragmento tampoco se compila con gcc. my_filter.push (std :: fstream (...)) 'no función coincidente' –

+0

@epronk: ¿qué compilador es? Yo uso gcc 4.4.4: g ++ bz_test.cpp -I $ {BOOSTROOT}/include -L $ {BOOSTROOT}/lib -lboost_iostreams y compila sin problemas. Acabo de editar la publicación. – Arman

+0

¿Has resuelto esto? Si es así, publique una respuesta. – Cookie

Respuesta

3

Un fstream no se puede copiar, por lo que debe utilizar la versión de referencia de empuje

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

Por lo que su función debe ser algo como

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

estoy sorprendido que el compilador permite su código , Creo que se queja de una referencia temporal ... ¿qué compilador estás usando?

+0

@Pieter: Estoy usando VC++ 2008 Express edition: Version 9.0.30729.1 SP. El código se compila sin problemas y sin ninguna advertencia. Su sugerencia no resuelve el problema. Como antes, se detiene en: void bzip2_base :: end (bool compress) en la función iostreams/src/bzip2.cpp. – Arman

+2

Me parece que ha llegado al punto en el que necesita ir a las listas de correo de impulso. –

+0

@Ben Collins: Sí, eso es lo que hice. Gracias. – Arman

Cuestiones relacionadas