$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [iostreams] Flushing problems with :filtering_ostream
From: Bo Jensen (jensen.bo_at_[hidden])
Date: 2011-04-23 16:16:02
On Fri, Apr 22, 2011 at 10:55 PM, eg <egoots_at_[hidden]> wrote:
> On 4/22/2011 12:00 PM, Bo Jensen wrote:
>>>
>>> What version of Boost are you using?
>>>
>>> The reason I ask is because there was a "flushing a filtering_ostream"
>>> bug
>>> which was fixed in Boost 1.46.
>>>
>>> For details see:
>>> https://svn.boost.org/trac/boost/ticket/4590
>>>
>>>
>>
>> Thanks for the reply. I am currently investigating if some of the
>> issues mentioned in the thread is effecting my code.
>>
>> I am using boost 1.46.1, but the bug is not fixed ! I downloaded and
>> ran the first test case and it failed still.
>
> Looking at the ticket, it refers to the changeset that was committed. A new
> test case was added to the sources in the file:
> "test_filtering_ostream_flush.hpp"
>
> Specifically, you should be able to see this in:
> boost_1_46_1\libs\iostreams\test\filtering_stream_flush_test.hpp
>
> If you run these tests on your computer, do they pass? (You should be able
> to run bjam from the test directory).
> If so, how does this official test case differ from your own problem?
>
> Also, there is another variation of a flush issue referenced in the ticket
> at:
> https://svn.boost.org/trac/boost/ticket/4728
>
>
Thanks, I will give it another look.
I have made a simple case demonstrating the issue :
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/code_converter.hpp>
#include <cstdio>
#include <iostream>
#define WORKS
//#define DO_NOT WORK
/* Helper class for writing gzipped files */
class gzip_sink
{
  public:
    typedef char                           char_type;
    typedef boost::iostreams::sink_tag     category;
    boost::iostreams::filtering_ostream    sink_;       /* Sink used
to push filters */
    std::ofstream                          &outifstr_;  /* Write
stream to be pushed into sink */
    /* Constructor */
    gzip_sink(std::ofstream &wrt) :
      outifstr_(wrt)
    {
      #ifdef DO_NOT_WORK
      /* Push gzip compressor */
      sink_.push(boost::iostreams::gzip_compressor());
      /* Push file writer */
      sink_.push(outifstr_);
      #endif
    }
    gzip_sink(const gzip_sink &rhs) :
      outifstr_(rhs.outifstr_)
    {
      #ifdef DO_NOT_WORK
      /* Push gzip compressor */
      sink_.push(boost::iostreams::gzip_compressor());
      /* Push file writer */
      sink_.push(outifstr_);
      #endif
    }
    /* Write function */
    std::streamsize write( const char * s, std::streamsize n )
    {
      #ifdef WORKS
      /* Push gzip compressor */
      sink_.push(boost::iostreams::gzip_compressor());
      /* Push file writer */
      sink_.push(outifstr_);
      #endif
      /* Push write stream */
      sink_.write(s,n);
      #ifdef WORKS
      sink_.pop();
      sink_.pop();
      #endif
      return n;
    }
};
/* Typedef */
typedef boost::iostreams::code_converter<gzip_sink> convert_to_narrow_sink;
int main(int argc, char *argv[])
{
  std::ofstream strm("test.gz");
  gzip_sink gzip(strm);
  convert_to_narrow_sink convert(gzip);
  boost::iostreams::filtering_wostreambuf wbuf(convert,100);
  std::wostream wout(&wbuf);
  wout <<"Hello world!"<< std::endl;
}
I hope someone can make it flush correctly or say I made a simple mistake..