Linux程式設計入門 - zlib的運用(轉)

BSDLite發表於2007-08-11
Linux程式設計入門 - zlib的運用(轉)[@more@]gzip(*.gz)檔案格式幾乎是Linux下的標準格式了,有人認為bzip2的壓縮率比

gzip來得高。一般來說,這個說法大致正確,不過根據我個人的經驗,有一半

以上的檔案,bzip2沒有比gzip的壓縮率來得高,有少數狀況下,gzip壓縮率反

而比bzip2來的高。


zlib是個支援gzip檔案格式的函式庫,它使得gz檔的存取就猶如開檔關檔一樣

地容易,您可以很容易地為您的程式加入gz檔的支援。



使用範例 : showgz.c


#include

#include

#include


void main(int argc,char **argv)

{

gzFile zip;

int c;


if (argc<2) return;


zip = gzopen(argv[1],"rb");

while ((c=gzgetc(zip))!=EOF) putchar(c);

gzclose(zip);

}


編譯


gcc -o showgz showgz.c -lz


檢驗


gzip -9 < showgz.c > showgz.c.gz

./showgz showgz.c.gz


將會把這個程式內容顯示出來,showgz的作用可說等於gzip -dc。



函式宣告


gzFile gzopen (const char *path, const char *mode);

開啟一個gzip(*.gz)檔。

mode叄數可為"rb"或"wb"。

另外也可包含壓縮程度如"wb9"。

用'f'作為過濾資料,如"wb6f"。

用'h'可指定Huffman only壓縮,如"wb1h"

gzopen亦可用於讀取非壓縮的gzip檔案格式,在這種狀況下,gzread會直接讀

取,而不進行解壓縮。




int gzread (gzFile file, voidp buf, unsigned len);

與read的用法相同。


int gzwrite (gzFile file, const voidp buf, unsigned len);

與write用法相同。


int gzprintf (gzFile file, const char *format, ...);

與fprintf用法相同。


char * gzgets (gzFile file, char *buf, int len);

與fgets用法相同。


int gzputc (gzFile file, int c);

與fputc用法相同。


int gzgetc (gzFile file);

與fgetc用法相同。


int gzflush (gzFile file, int flush);

與fflush作用相同。


z_off_t gzseek (gzFile file, z_off_t offset, int whence);

whence不支援SEEK_END

如果檔案是開啟為"讀取",則SEEK_SET及SEEK_CUR,向前及向後均支援,不過

很慢就是了。

如果檔案是開啟為"寫入",僅支援向前SEEK。


int gzrewind (gzFile file);

與gzseek(file, 0L, SEEK_SET)相同作用,僅在讀取時有效。


z_off_t gztell (gzFile file);

返回值 : 目前檔案位置(解壓縮後的位置)


int gzeof (gzFile file);

返回值 : 1 - EOF, 0 - not EOF


int gzclose (gzFile file);

關閉檔案

返回值 : zlib error number



OK STATION, Webmaster, Brian Lin

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-947587/,如需轉載,請註明出處,否則將追究法律責任。

相關文章