Boost logo

Boost Users :

Subject: Re: [Boost-users] count compressed bytes
From: Roland Bock (rbock_at_[hidden])
Date: 2010-06-11 09:45:42


Philipp Kraus wrote:
> On 2010-06-11 13:06:46 +0200, Philipp Kraus said:
>
>> On 2010-06-11 09:41:40 +0200, Roland Bock said:
>>
>>> Kraus Philipp wrote:
>>>> Hi,
>>>>
>>>> I have implemented this litte code to compress a file
>>>>
>>>> bio::filtering_streambuf< bio::input > l_deflate;
>>>> switch (m_compress) {
>>>> case gzip : l_deflate.push( bio::gzip_compressor() ); break;
>>>> case bzip2 : l_deflate.push( bio::bzip2_compressor() ); break;
>>>> }
>>>>
>>>>
>>>>
>>>> l_deflate.push( bio::file_source(p_str, BOOST_IOS::binary) );
>>>>
>>>>
>>>> I need only the number of compressed bytes of l_deflate. I try to
>>>>
>>>> use l_deflate.size() but it returns only a fixed number.
>>>>
>>>>
>>>> How I can read the number of compressed bytes?
>>>>
>>>>
>>>> Thanks
>>>>
>>>>
>>>> Phil
>>>>
>>>
>>> The only method I know is to add a small filter which counts the Bytes.
>>
>> I have found this
>> http://www.boost.org/doc/libs/1_43_0/boost/iostreams/filter/counter.hpp
>> Can I use this class? I don't know how I can use the class (must I only
>> create a new object and push it to my l_deflate) ?
>
> I have add this code:
>
> bio::filtering_streambuf< bio::input > l_deflate;
> switch (m_compress) {
> case gzip : l_deflate.push( bio::gzip_compressor() );
> break;
> case bzip2 : l_deflate.push( bio::bzip2_compressor() );
> break;
> }
>
> // create counter structures
> bio::counter l_counter;
> l_deflate.push( boost::ref(l_counter) );
> l_deflate.push( bio::file_source(p_str1, BOOST_IOS::binary) );
>
> but l_counter.characters() returns always zero. At next I have
> declared a filter_ostream and copy l_deflate to the ostream in which I
> pushed the l_counter. At this I run into a bus error.
> For testing I've copy the l_deflate to std::cout and I can see the
> compressed data.
>
> Thanks for help

Hi,

I haven't actually used this filter myself, but here are some thoughts:

   1. when you get the counter to work, it will probably count the
      uncompressed bytes. You should add it before the compressor, so
      that bytes travel from source to compressor to counter.
   2. If l_counter.characters() is always zero, I'd suspect that the
      filter is copied, when it is pushed to the stream. I haven't found
      respective information in the documentation at once, so I would
      suggest to add some debug code to the filter class, to
          * see if the characters are actually finding their way through
            the filter
          * make sure that the filter is not copied

Once you figure out what went wrong, maybe you could create a
documentation ticket containing the relevant information.

Regards,

Roland



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