zlibを使ったサンプルプログラム
(gzipファイルの読み書き)
gzip圧縮されたファイルの書き込みと、読み込みを行うサンプルプログラムを作成します。PHPの解説は良く見かけるのですが、Cソースはあまり見たことがないので載せておきます。PHPと同じように、gzip圧縮されたファイルであることを意識せずに、ファイルの読み書きができます。 |
#include <stdio.h>
#include <string.h>
#include <zlib.h>
#define FILENAME "test.gz"
#define FILENAME2 "copy.gz"
int gzfile_puts(void);
int gzfile_gets(void);
int gzfile_copy(void);
int main(void)
{
gzfile_puts();
gzfile_gets();
gzfile_copy();
return 0;
}
int gzfile_puts(void)
{
char buf[]="0123456789abcdefghijklmnopqrstuvwxyz\n";
int cnt = 0;
gzFile zp;
zp = gzopen(FILENAME, "w9");
if(zp == NULL){
fprintf(stderr, "gzopen error\n");
return -1;
}
for(cnt = 0; cnt < 100; cnt++){
gzputs(zp, buf);
}
gzclose(zp);
return 0;
}
int gzfile_gets(void)
{
char buf[256] = {0};
gzFile zp;
int line = 1;
zp = gzopen(FILENAME, "rb");
if(zp == NULL){
fprintf(stderr, "gzopen error\n");
return -1;
}
while(gzgets(zp, buf, sizeof(buf)) != Z_NULL){
printf("%4d %s", line, buf);
line++;
}
gzclose(zp);
return 0;
}
int gzfile_copy(void)
{
char buf[256] = {0};
int cnt = 0;
gzFile rzp, wzp;
rzp = gzopen(FILENAME, "rb");
if(rzp == NULL){
fprintf(stderr, "gzopen error\n");
return -1;
}
wzp = gzopen(FILENAME2, "w1");
if(wzp == NULL){
fprintf(stderr, "gzopen error\n");
return -1;
}
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
gzwrite(wzp, buf, cnt);
}
gzclose(rzp);
gzclose(wzp);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(プログラムの概要)
gzopen/gzclose/gzputs/gzgets/gzread/gzwriteの簡単なサンプルプログラムです。大まかな動作としては、適当な文字列を100行分gzip圧縮しながら書き込み、読み込みを行う。次に圧縮率を変えて、gzipファイルをコピーします。gzopenやgzgetsはそれぞれfopenやfgetsのように使用できます。
18L-35L:gzfile_puts()gzputs()による1行書き込み。test.gzというファイルを作成し、gzputs()で100行分適当な文字列を書き込みます。
gzopen()でファイルをオープンします。第2引数はオープンするモードで、fopen()の引数と似ています。後ろに圧縮率を表す数字が付いてw9のようになります。(圧縮率は9が最大で1が処理速度優先、0は圧縮なしです。)gzputs()で1行ずつファイルに書き込んでいます。 36L-53L:gzfile_gets()
gzgets()による1行読み込み。上で作成したtest.gzから1行ずつ読み出して表示します。gzopen()でファイルを開き、gzgets()でバッファに読み込みprintf表示しています。 54L-77L:gzfile_copy()
gzread()/gzwrite()による読書。
上で作成したtest.gzというファイルの中身を読み出し、copy.gzというファイルに書き込みます。この時圧縮率を下げて(w1でgzopen)書き込んでいます。
(コンパイルと動作)
gcc -Wall -Werror -o gztest gztest.c -lz
-lzでzlibをリンクしてください。実行するとtest.gzというファイルとcopy.gzというファイルが作成されます。ls-lで見るとファイルサイズが若干違っていることが分かります。また、gunzipコマンドで解凍すればテキストファイルになることが確認できます。