一般我们自己用.gz文件的时候会先
gzip xxx.gz
然后就地解压缩生成文件,如果本身就是要原文件还行,但如果再程序需要在内存中再处理,就不OK了。
因为会浪费两次I/O,特别是文件特别大或者特别多的时候。
因此,使用zlib将.gz文件直接解压并读取到内存,就很重要了。
#include <zlib.h> #include <iostream> #include <string> #define GZ_BUF_SIZE 1048576 bool gzLoad(char* gzfn, ::std::string &out) { //open .gz file gzFile gzfp = gzopen(gzfn,"rb"); if(!gzfp) { return false; } //read and add it to out unsigned char buf[GZ_BUF_SIZE]; int have; while( (have = gzread(gzfp,buf,GZ_BUF_SIZE)) > 0) { out.append((const char*)buf,have); } //close .gz file gzclose(gzfp); return true; } int main(int argc,char** argv) { if(argc!=2) { ::std::cout<<"Usage: ./test xxx.gz"<<::std::endl; return -1; } ::std::string out; if(gzLoad(argv[1],out)) { ::std::cout<<out<<::std::endl; } else { ::std::cout<<"gzLoad Error"<<::std::endl; } return 0; }
Sounds great! But how could I read a gz file line-by-line?
最简单的方法,就是全部解压,然后逐行读取。
例如Linux下可以 gunzip -c | cat -
如果压缩文件不能解压怎么判断?