PDA

View Full Version : Outputting to file in the most compressed form (c++)


maverick_starstrider
Sep22-09, 05:25 PM
Hi, I'm just wondering, usually when I output to file in C++ I just do like:

fout.open("output.txt",ios::out);
fout.precision(13);
fout << data1 << " " << data2 << " " << data3 << endl;

or something to that effect. i.e. I use c++'s file streams. However, for my current application minimizing space is an absolute must. Therefore, are there other ways of outputting this same data (columns of 3 doubles) to a file that will create a smaller file? I've experimented with fprintf and such but it seems to create the same sized file. Any help is greatly appreciated.

chroot
Sep22-09, 05:29 PM
Use zlib (http://www.zlib.net/), probably the most common compression library on the planet.

If you want a C++ stream version of it, try gzstream (http://www.cs.unc.edu/Research/compgeom/gzstream/)

- Warren

maverick_starstrider
Sep22-09, 06:27 PM
Use zlib (http://www.zlib.net/), probably the most common compression library on the planet.

If you want a C++ stream version of it, try gzstream (http://www.cs.unc.edu/Research/compgeom/gzstream/)

- Warren

I can't actually use any third party libraries because I have no control over the implementation, or the compiler.

Hurkyl
Sep22-09, 08:38 PM
I can't actually use any third party libraries because I have no control over the implementation, or the compiler.
Are those really problems?



Anyways, if space really, really is a concern, then you shouldn't be writing anything in human readable text formats, because that is a huge waste of space. Use the C++ ostream::write or the fwrite functions to write raw bytes, e.g.


double x;
double y[3];
fout.write(static_cast<const char*>(&x), sizeof(double));
fout.write(static_cast<const char*>(y), sizeof(y));


and read similarly. If the file needs to be transferable between different computers that lay things out differently in memory, then you need to do a little more work to write things out in a portable format.