2010-04-01 27 views
6

Xin chào, tôi muốn lưu trữ dữ liệu của mình vào tệp bzip2 bằng cách sử dụng Boost.IOstreams.BOOST.IOstreams: gặp sự cố khi ghi vào 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. 
} 
}; 

Tôi đang làm gì sai? Tôi đang sử dụng tăng 1.42.0.

loại liên quan Arman.

EDIT Mã này được làm việc nếu tôi loại bỏ các tùy chọn hai chiều:

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

có thể một số người ta có thể giải thích tại sao?

+0

Đoạn thứ hai cũng không biên dịch với gcc. my_filter.push (std :: fstream (...)) 'không có hàm phù hợp' –

+0

@epronk: trình biên dịch là gì? Tôi sử dụng gcc 4.4.4: g ++ bz_test.cpp -I $ {BOOSTROOT}/bao gồm -L $ {BOOSTROOT}/lib -lboost_iostreams và nó biên dịch mà không có vấn đề gì. Tôi vừa chỉnh sửa bài đăng. – Arman

+0

Bạn đã giải quyết vấn đề này chưa? Nếu vậy, hãy đăng câu trả lời. – Cookie

Trả lời

3

Một fstream không thể sao chép, vì vậy bạn phải sử dụng phiên bản tài liệu tham khảo của push

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

Vì vậy, chức năng của bạn sẽ giống như

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

Tôi ngạc nhiên bạn biên dịch cho phép mã của bạn , Tôi nghĩ rằng nó phàn nàn về một tham chiếu đến tạm thời ... trình biên dịch mà bạn đang sử dụng?

+0

@Pieter: Tôi đang sử dụng phiên bản VC++ 2008 Express: Phiên bản 9.0.30729.1 SP. Mã biên dịch trơn tru mà không có bất kỳ cảnh báo nào. Đề xuất của bạn không giải quyết được sự cố. Như trước khi nó dừng lại ở: void bzip2_base :: end (bool compress) trong hàm iostreams/src/bzip2.cpp. – Arman

+2

Dường như với tôi bạn đã đạt đến điểm mà tại đó bạn cần phải đi đến danh sách gửi thư nâng cao. –

+0

@Ben Collins: Vâng, đó là những gì tôi đã làm. Cảm ơn. – Arman

Các vấn đề liên quan