|
Boost Users : |
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..
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net