现在的位置: 首页 > 编程语言 > 正文

zlib之gzip file常用函数

2018年10月05日 编程语言 ⁄ 共 1629字 ⁄ 字号 评论关闭

打开关闭函数: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);
}

抱歉!评论已关闭.