| 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
-- 在江湖中,只要拿起了刀,就是一場無涯的夢。
|