6

Hello I am would like to store my data in to bzip2 file using Boost.IOstreams.

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

What I am doing wrong? I am using boost 1.42.0.

kind regards Arman.

EDIT The code is working if I remove the bidirectional option:

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

maybe some one can explain why?

Arman
  • 4,566
  • 10
  • 45
  • 66

1 Answers1

3

An fstream can not be copied, so you must use the reference version of push

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

So your function should look something like

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

I'm suprised you compiler allows your code, I'd think it complain about a reference to temporary... which compiler are you using?

Pieter
  • 17,435
  • 8
  • 50
  • 89
  • @Pieter: I am using VC++ 2008 Express edition: Version 9.0.30729.1 SP. The code compiles smoothly without any warning. Your suggestion does not solve the problem. As before it is stops in: void bzip2_base::end(bool compress) in iostreams/src/bzip2.cpp function. – Arman Apr 01 '10 at 09:35
  • 2
    Seems to me you've reached the point at which you need to go to the boost mailing lists. – Ben Collins Apr 07 '10 at 12:19
  • @Ben Collins: Yes, that what I did.Thanks. – Arman Apr 08 '10 at 10:52