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:
- 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.
- 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