2009年5月21日木曜日

zlib にハマる

 とある Windows プログラムで,.gz 圧縮されたログファイル (テキスト) を直接読めるように,zlib を組み込んでみた.下がその一部

if(( fp = gzopen(( char *)szFileName, "r" )) == NULL ) return FALSE;
while( gzgets( fp, szBuf, BUF_SIZE ) != Z_NULL ){
....
}
gzclose( fp );

なんのことはない,fopen/fgets/fclose を gz なんちゃらに置き換えただけ.こんなん余裕っすよ.と思って実行してみたら,「invalid distances set」やら「invalid distance too far back」やらで全然リードできねぇ.たったこれだけのコードのどこに間違う余地があるのか_| ̄|○

 と,ふと目にとまったのが gzopen( ... , "r" ) の "r".Windows 上のテキストファイルだから何も考えずに "r" にしていたのだが,"rb" にしてみたら直ったヽ(´ー`)ノ "r" だと,0x0D 0x0A が 0x0A に変換されたりして .gz が壊れたのと同じ状態になってたんだろうな.
 てか,gz から解凍後のデータに対してテキストモードを適用すると思うでしょ普通.gz ファイル自体にテキストモードを適用してどうする (--# むか

0 件のコメント:

コメントを投稿