On Mon, Apr 11, 2011 at 3:35 AM, <Viatcheslav.Sysoltsev@h-d-gmbh.de> wrote:
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;
}


Works just fine on linux gcc 4.3.2 boost 1.45. with 5e5, 5e6 and 5e7 size.
As a guess, I'd delete memblock after closing the out to be on a safe side, maybe it helps.

-- Slava


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users


If anyone is still interested, this is what I got to work after much hair-pulling. Maybe someone who understand streams (std and boost) better than I can explain why this works and my previous attempts created corrupt files when size was large (again, I'm using Windows, VS 2008). Cheers, Anders

#include <fstream>
#include <iostream>
#include <sstream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

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

int main()
{
    //Trying with stringstream, which can act as both istream and ostream
    int size = 5700 * 4800 * 2; //This happens to be the actual size of the data I need to write
    char* memblock = new char [size]; //Data to write

    stringstream ss(stringstream::in | stringstream::out | stringstream::binary); //Declare ss
    ss.write(memblock, size); //Write data to ss

    io::filtering_streambuf<io::input> buf; //Declare buf
    buf.push(io::gzip_compressor()); //Assign compressor to buf
    buf.push(ss); //Push ss to buf
    ofstream out("c:/outfile.gz", ios_base::out | ios_base::binary); //Declare out
    io::copy(buf, out); //Copy buf to out

    //Clean up
    out.close();
    delete[] memblock;

    return 0;
}



--
Anders Knudby, PhD
e-mail: knudby@gmail.com
skype ID: anders.knudby

Man's mind, once stretched by a new idea, never regains its original dimensions.
~ Oliver Wendell Holmes