打开关闭函数:gzopen、gzclose
写gzip file函数:gzwrite、gzputs、gzputc、gzprintf
读gzip file函数:gzread、gzgets、gzgetc
其他函数:gztell、gzseek、gzrewind
两个不太好理解的函数:gzungetc、gzoffset
代码如下:
#include <iostream>
#include <string>
#include <zlib.h>
#include <zconf.h>
using namespace std;
void main(int argc, char *argv[])
{
//ab每次写的时候追加,wb每次写会覆盖之前的内容
gzFile gzfp = gzopen("test.gz","rb");
if(NULL == gzfp)
{
cout<<"Fail to open file."<<endl;
return;
}
/*******************************写gz文件*******************************/
//当前写的位置为0,
//write时,只能向后seek
cout<<"gztell:"<<gztell(gzfp)<<endl;
gzseek(gzfp, 10, 0);
cout<<"gztell:"<<gztell(gzfp)<<endl;
//gzwrite返回值,是写入的字节数,压缩前的字节数
char buf[20] = "1abcdefghijklmn";
int len = strlen(buf);
cout<<"gzwrite:"<<gzwrite(gzfp, buf, len)<<endl;
//gzputs返回值,是写入的字节数,压缩前的字节数
cout<<"gzputs:"<<gzputs(gzfp, "zxc")<<endl;
//gzputs返回值,是字符'b'的值
cout<<"gzputc:"<<gzputc(gzfp, 'b')<<endl;
//gzprintf
cout<<"gzprintf:"<<gzprintf(gzfp, "%d,%s", 99, "efg")<<endl;
/*******************************读gz文件*******************************/
//gzread
gzseek(gzfp, 10, 0);
//gzungetc放一个字符到流中,下次读取时,先读这个字符。
//gzungetc后,调用gzseek、gzrewind,gzungetc将失效。
gzungetc('z', gzfp);
//gzread返回值,是实际读取的字节数,解压缩后的字节数
//如果在写入时调用了,gzseek了10个字节,那么这10个字节填充0。读取时遇到这个10个字节时,会认为是字符串的结束。
char sz_read_buf[100] = {0};
gzread(gzfp, sz_read_buf, 10);
cout<<"gzread:"<<sz_read_buf<<endl;
//gzgets
gzseek(gzfp, 10, 0);
memset(sz_read_buf, 0, 100);
gzgets(gzfp, sz_read_buf, 99);
cout<<"gzgets:"<<sz_read_buf<<endl;
//gzgetc
gzseek(gzfp, 14, 0);
gzrewind(gzfp);
cout<<"gzgetc:"<<gzgetc(gzfp)<<endl;
//gzoffset
//返回压缩文件中将要读或写的位置。
//举例:第一次写入25个字节,压缩后44;
// 第二次写入35个字节,2次写入压缩后91。
//
// 当从头读取10个字节时,gzoffset为44
// 当从头读取30个字节时,gzoffset为91
cout<<"gzoffset:"<<gzoffset(gzfp)<<endl;
gzclose(gzfp);
}