Я обнаружил, что gzeof() ведёт себя по-разному, в зависимости от того, находимся ли мы режиме "transparent" (cat) или же в режиме настоящего разжатия. А именно, в режиме настоящего разжатия, если прочитано батйтов меньше, чем запрошено, то (автоматически) выставляется флаг EOF. В transparent режиме, если прочитано меньше, чем требуется, то флаг EOF выставляется только после следующего gzread(), который возвращает 0. $ cat test.c #include #include #include #include int main(int argc, char *argv[]) { gzFile gz = gzopen(argv[1], "rb"); assert(gz); char buf[BUFSIZ]; int n = gzread(gz, buf, sizeof(buf)); printf("n=%d eof=%d\n", n, gzeof(gz)); return 0; } $ echo a >a $ echo a |gzip >a.gz $ gcc -Wall test.c -lz $ ./a.out a.gz n=2 eof=1 $ ./a.out a n=2 eof=0 $ Хотел спросить, надо это фиксить или нет.