User:Timothee Flutre/Notebook/Postdoc/2012/09/12: Difference between revisions
From OpenWetWare
(→Handling compressed files with gzip in C++: add code) |
(fix raw html notebook nav) |
||
(2 intermediate revisions by one other user not shown) | |||
Line 2: | Line 2: | ||
|- | |- | ||
|style="background-color: #EEE"|[[Image:owwnotebook_icon.png|128px]]<span style="font-size:22px;"> Project name</span> | |style="background-color: #EEE"|[[Image:owwnotebook_icon.png|128px]]<span style="font-size:22px;"> Project name</span> | ||
|style="background-color: #F2F2F2" align="center"| | |style="background-color: #F2F2F2" align="center"|[[File:Report.png|frameless|link={{#sub:{{FULLPAGENAME}}|0|-11}}]][[{{#sub:{{FULLPAGENAME}}|0|-11}}|Main project page]]<br />{{#if:{{#lnpreventry:{{FULLPAGENAME}}}}|[[File:Resultset_previous.png|frameless|link={{#lnpreventry:{{FULLPAGENAME}}}}]][[{{#lnpreventry:{{FULLPAGENAME}}}}{{!}}Previous entry]] }}{{#if:{{#lnnextentry:{{FULLPAGENAME}}}}|[[{{#lnnextentry:{{FULLPAGENAME}}}}{{!}}Next entry]][[File:Resultset_next.png|frameless|link={{#lnnextentry:{{FULLPAGENAME}}}}]]}} | ||
|- | |- | ||
| colspan="2"| | | colspan="2"| | ||
Line 17: | Line 17: | ||
<nowiki> | <nowiki> | ||
// Author: Timothee Flutre | // Author: Timothee Flutre | ||
// Aim: show how to use Zlib in your own C++ code | // Aim: show how to use Zlib in your own C++ code | ||
// Compilation: g++ -Wall -Wextra -g test.cpp -lz | // Compilation: g++ -Wall -Wextra -g test.cpp -lz | ||
// Not copyrighted -- provided to the public domain | // Not copyrighted -- provided to the public domain | ||
#include <cmath> | #include <cmath> | ||
Line 34: | Line 34: | ||
#include "zlib.h" | #include "zlib.h" | ||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||
// copy-paste and use the four following functions in your own code | // copy-paste and use the four following functions in your own code | ||
void | void | ||
Line 77: | Line 77: | ||
{ | { | ||
c = gzgetc (fileStream); | c = gzgetc (fileStream); | ||
if (c == -1) // eof or error | if (c == -1) // eof or error | ||
{ | { | ||
res = 0; | res = 0; | ||
break; | break; | ||
} | } | ||
else if (c == 10) // 10 is ASCII code for '\n' | else if (c == 10) // 10 is ASCII code for '\n' | ||
break; | break; | ||
else | else | ||
Line 97: | Line 97: | ||
const size_t & lineId) | const size_t & lineId) | ||
{ | { | ||
// if (gzprintf (fileStream, "%s", line.c_str()) <= 0) | // if (gzprintf (fileStream, "%s", line.c_str()) <= 0) | ||
if (gzputs (fileStream, line.c_str()) < 0) | if (gzputs (fileStream, line.c_str()) < 0) | ||
{ | { | ||
Line 106: | Line 106: | ||
} | } | ||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||
// functions to show how it works | // functions to show how it works | ||
void | void | ||
Line 114: | Line 114: | ||
cout << __FUNCTION__ << endl; | cout << __FUNCTION__ << endl; | ||
// create a dummy file via a system call | // create a dummy file via a system call | ||
system ("rm -f data.txt.gz; echo -e \"aaa\nbb\nccc\" | gzip > data.txt.gz"); | system ("rm -f data.txt.gz; echo -e \"aaa\nbb\nccc\" | gzip > data.txt.gz"); | ||
// read the dummy file using zlib API | // read the dummy file using zlib API | ||
string fileName = "data.txt.gz"; | string fileName = "data.txt.gz"; | ||
gzFile fileStream; | gzFile fileStream; | ||
openFile (fileName, fileStream, "rb"); // works also if file not compressed | openFile (fileName, fileStream, "rb"); // works also if file not compressed | ||
string line; | string line; | ||
size_t lineId = 0; | size_t lineId = 0; | ||
Line 136: | Line 136: | ||
closeFile (fileName, fileStream); | closeFile (fileName, fileStream); | ||
// clean | //clean | ||
system ("rm -f data.txt.gz"); | system ("rm -f data.txt.gz"); | ||
} | } | ||
Line 144: | Line 144: | ||
cout << __FUNCTION__ << endl; | cout << __FUNCTION__ << endl; | ||
// write a dummy file using zlib API | // write a dummy file using zlib API | ||
string fileName = "data.txt.gz"; | string fileName = "data.txt.gz"; | ||
gzFile fileStream; | gzFile fileStream; | ||
Line 156: | Line 156: | ||
closeFile (fileName, fileStream); | closeFile (fileName, fileStream); | ||
// read it via a system call | // read it via a system call | ||
system ("zcat data.txt.gz"); | system ("zcat data.txt.gz"); | ||
// clean | // clean | ||
system ("rm -f data.txt.gz"); | system ("rm -f data.txt.gz"); | ||
} | } | ||
Line 172: | Line 172: | ||
} | } | ||
</nowiki> | </nowiki> | ||
* As usual, I'm not the only one who came up with something like this, have a look at [http://nilshomer.com/index.php?title=AFLIB AFLIB] by Niels Homer, a minimal C library integrating stdio, ZLIB and LIBBZIP2. | |||
<!-- ##### DO NOT edit below this line unless you know what you are doing. ##### --> | <!-- ##### DO NOT edit below this line unless you know what you are doing. ##### --> |
Latest revision as of 21:59, 26 September 2017
Project name | Main project page Previous entry Next entry |
Handling compressed files with gzip in C++
Disclaimer: I am not a professional programmer, so I'm sure it's possible to do better (please, provide feedback!), but at least it's working smoothly for me and it should help other people as well. // Author: Timothee Flutre // Aim: show how to use Zlib in your own C++ code // Compilation: g++ -Wall -Wextra -g test.cpp -lz // Not copyrighted -- provided to the public domain #include <cmath> #include <ctime> #include <getopt.h> #include <cerrno> #include <iostream> #include <string> #include <sstream> using namespace std; #include "zlib.h" //----------------------------------------------------------------------------- // copy-paste and use the four following functions in your own code void openFile ( const string & pathToFile, gzFile & fileStream, const char * mode) { fileStream = gzopen (pathToFile.c_str(), mode); if (fileStream == NULL) { cerr << "ERROR: can't open file " << pathToFile << " with mode " << *mode << " (errno=" << errno << ")" << endl; exit (1); } } void closeFile ( const string & pathToFile, gzFile & fileStream) { int ret = gzclose (fileStream); if (ret != Z_OK) { cerr << "ERROR: can't close the file " << pathToFile << ", gzclose() returned " << ret << endl; exit (1); } } int getline ( gzFile & fileStream, string & line) { int res = 1, c; line.clear (); while (true) { c = gzgetc (fileStream); if (c == -1) // eof or error { res = 0; break; } else if (c == 10) // 10 is ASCII code for '\n' break; else line.push_back (c); } return res; } void gzwriteLine ( gzFile & fileStream, const string & line, const string & pathToFile, const size_t & lineId) { // if (gzprintf (fileStream, "%s", line.c_str()) <= 0) if (gzputs (fileStream, line.c_str()) < 0) { cerr << "ERROR: can't write line " << lineId << " in file " << pathToFile << endl; exit (1); } } //----------------------------------------------------------------------------- // functions to show how it works void readAGzipFileWithZlib () { cout << __FUNCTION__ << endl; // create a dummy file via a system call system ("rm -f data.txt.gz; echo -e \"aaa\nbb\nccc\" | gzip > data.txt.gz"); // read the dummy file using zlib API string fileName = "data.txt.gz"; gzFile fileStream; openFile (fileName, fileStream, "rb"); // works also if file not compressed string line; size_t lineId = 0; while (getline (fileStream, line)) { ++lineId; cout << "line " << lineId << ": " << line << endl; } if (! gzeof (fileStream)) { cerr << "ERROR: can't read successfully file " << fileName << " up to the end" << endl; exit (1); } closeFile (fileName, fileStream); //clean system ("rm -f data.txt.gz"); } void writeAGzipFileWithZlib () { cout << __FUNCTION__ << endl; // write a dummy file using zlib API string fileName = "data.txt.gz"; gzFile fileStream; openFile (fileName, fileStream, "wb"); stringstream ssLine; ssLine << "1"; for (size_t i = 1; i < 10; ++i) ssLine << " " << (i+1); ssLine << endl; gzwriteLine (fileStream, ssLine.str(), fileName, 1); closeFile (fileName, fileStream); // read it via a system call system ("zcat data.txt.gz"); // clean system ("rm -f data.txt.gz"); } int main (void) { readAGzipFileWithZlib (); writeAGzipFileWithZlib (); return EXIT_SUCCESS; }
|