使用C++和zlib解压缩.gz文件并读入内存

一般我们自己用.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;
}

3 thoughts on “使用C++和zlib解压缩.gz文件并读入内存

    1. coder4 Post author

      最简单的方法,就是全部解压,然后逐行读取。
      例如Linux下可以 gunzip -c | cat -

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *