Boost logo

Boost Users :

Subject: Re: [Boost-users] Writing large binary files with boost gzip
From: Anders Knudby (knudby_at_[hidden])
Date: 2011-04-08 12:06:04


On Fri, Apr 8, 2011 at 7:43 AM, Jeff Flinn <TriumphSprint2000_at_[hidden]>wrote:

> Anders Knudby wrote:
>
>> Many thanks for the quick response. And apologies for being a total
>> newbie, but how do I close the stream (and how do I check that it has been
>> closed)? With normal iostreams I would just write "out.close();", out being
>> the name of the stream. But that doesn't seem to be the way to do it for
>> filtering_iostreams?!? And I would think it would close when it goes out of
>> scope, but I haven't checked. Any help appreciated. I'm pleased it worked
>> for you on Linux, but I'm largely stuck with Windows for the time being...
>>
>
> Can you post a complete small example demonstrating the problem? The
> destructor should close the stream. The docs for iostreams::stream shows a
> close method at
> http://www.boost.org/doc/libs/1_46_1/libs/iostreams/doc/index.html.
>
> Please don't top post.
>
> Jeff
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>

Ok, here's my entire script. As mentioned in the comments it works fine if
size=5e5. It also runs fine if size=5e6, but then the resulting file is
corrupt (i.e. cannot be gunzipped with the gzip utility). Try it out. I'm
using Visual Studio 2008 in a Windows XP machine.

#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_stream.hpp>

using namespace std;
namespace io = boost::iostreams;

int main()
{
    //Set filename
    string outfile = "c:/outfile.bin.gz";

    //Set filesize
    int size = int(5e6); // <- If I change this to '5e5' instead of '5e6',
everything works just fine.

    //Declare memory block to be compressed to file
    char* memblock = new char [size];

    //Create a filtering_ostream out
    io::filtering_ostream out;

     //Assigns the gzip_compressor to out
    out.push(io::gzip_compressor());

     //Assigns out as a file sink
    out.push(io::file_sink(outfile));

    //Write memblock to out
    out.write(memblock, size);

    //Clean up
    delete[] memblock;
    io::close(out); //Note, also tried 'out.close();', 'io::close(out,
ios_base::out);' and 'close(out);'. Same result.

    return 0;
}

-- 
Anders Knudby


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