2010-04-01 11 views
6
yazmaya

Merhaba Boost.IOstreams kullanarak bzip2 dosyasına benim veri depolamak istiyorum duyuyorum. Yanlış yapıyorumBOOST.IOstreams: sorun 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. 
} 
}; 

? Yükseltme 1.42.0 kullanıyorum.

tür Arman görüyor.

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

belki bazı biri neden açıklayabilir: Ben çift yönlü seçeneği kaldırırsanız

DÜZENLEME kod çalışıyor?

+0

İkinci snippet ayrıca gcc ile derleme yapmıyor. my_filter.push (std :: fstream (...)) 'eşleştirme işlevi yok' –

+0

@epronk: ne derleyici? Gcc 4.4.4: g ++ bz_test.cpp -I $ {BOOSTROOT}/include -L $ {BOOSTROOT}/lib -lboost_iostreams kullanıyorum ve sorunsuz bir şekilde derler. Gönderiyi yeni düzenledim. – Arman

+0

Bunu çözdünüz mü? Eğer öyleyse lütfen bir cevap yazınız. – Cookie

cevap

3

Eğer

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

Yani işlevi görünmelidir şey

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

gibi itme referans sürümünü kullanmanız gerekir böylece bir fstream Ben şaşırttı yaşıyorum, kopyalanamaz size derleyici kodunuzu verir , Geçici bir referanstan şikayet ettiğimi düşünürdüm ... hangi derleyiciyi kullanıyorsunuz?

+0

@Pieter: VC++ 2008 Express sürümü kullanıyorum: Sürüm 9.0.30729.1 SP. Kod, herhangi bir uyarı olmadan sorunsuz bir şekilde derlenir. Öneriniz sorunu çözmez. Önceden durduğu gibi: iostreams/src/bzip2.cpp fonksiyonunda void bzip2_base :: end (bool compress). – Arman

+2

Bana göre, posta gönderme listelerine gitmen gereken noktaya geldin. –

+0

@Ben Collins: Evet, yaptığım şey. Teşekkürler. – Arman