Zlib
Zlib是一個跨平台的壓縮函數庫,提供了一套 in-memory 壓縮和解壓函數,並能檢測解壓出來的數據的完整性(integrity)。關于zlib的更多信息請訪問 http://www.zlib.net
在 http://www.chinaaspx.com/archive/develop/11324.htm 上有一篇簡單地使用Zlib的文章。
上面那篇文章只是講解了簡單的對一些字符串的壓縮和解壓功能,而我下面將講解一下如何如何將字符傳保存在壓縮文件裡;如何從壓縮文件中讀出字符串,這些代碼來自于zlib自帶的例程中。
在項目設置中添加zlib的庫文件,然後在程序中添加下面的頭文件。
#include <zlib.h>
在程序開始前,設置下面變量:
static const char* myVersion=ZLIB_VERSION;
const char *hello="hello,the world!";
Byte uncompr[17];
int uncomprLen=17;
int len=strlen(hello);
int err;
gzFile file;
z_off_t pos;
第一變量是zlib的版本號;hello為我們寫入文件的數據。
檢查我們所使用的zlib。
if(zlibVersion()[0]!=myVersion[0])
{
fprintf(stderr,"不相容的zlib版本n");
}
else if(strcmp(zlibVersion(),ZLIB_VERSION)!=0)
{
fprintf(stderr,"警告:不同的zlib版本n");
}
將字符串寫入到hello.gz的壓縮文件中。
file=gzopen("hello.gz","rb");
if(file==NULL)
{
fprintf(stderr,"gz文件不能打開。n");
}
file = gzopen("hello.gz", "wb");
if (file == NULL) {
fprintf(stderr, "gzopen errorn");
exit(1);
}
if (gzprintf(file, "%s",hello) != 16) {
fprintf(stderr, "gzprintf err: %sn", gzerror(file, &err));
exit(1);
}
gzclose(file);
從hello.gz中讀去數據。
strcpy((char*)uncompr,"garbage");
uncomprLen=gzread(file,uncompr,(unsigned)uncomprLen);
if(uncomprLen!=len)
{
fprintf(stderr,"gz文件讀出錯誤:%sn",gzerror(file,&err));
printf("%d,%d",uncomprLen,len);
getch();
exit(1);
}
if(strcmp((char*)uncompr,hello))
{
fprintf(stderr,"讀出錯誤的數據:%sn",(char*)uncompr);
getch();
exit(1);
}
else
{
printf("讀出的數據:%sn",(char *)uncompr);
}
gzclose(file);