zlib,c和gzread

时间:2012-09-17 11:59:24

标签: c zlib

所以我在Ubuntu上使用zlib包。我正在试图弄清楚如何正确使用gzopen和gzread,这是我到目前为止所拥有的

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>

#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024

char buf[BUFFER_LENGTH];
int main(int argc, const char* argv[])
{
    int status;
    gzFile file;
    file = gzopen("beowulf.txt", "w");
    int counter = 0; /*when the counter reachers BUFFERS_FULL, stop*/
    if(file == NULL)
    {
        printf("COULD NOT OPEN FILE\n");
        return 1;
    }
    while(counter < NUM_BUFFERS)
    {
        status = gzread(file, buf, BUFFER_LENGTH - 2);
        printf("STATUS: %d\n", status);
        buf[BUFFER_LENGTH - 1] = "\0";
        printf("%s\n", buf);
        counter++;
    }
    gzclose(file);
    printf("STATUS: %d\n", status);
    return 0;
}

gzread("STATUS: %d\n",status);返回-2,我不知道为什么。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

模式"w"表示您准备创建新存档:

file = gzopen("beowulf.txt", "w");

您刚刚将文件截断为零长度。

此外,您应该使用二进制模式标记:"wb""rb"

此外,您假设的.gz-archive有一个扩展名.txt,这有点奇怪。

阅读docs,docs规则。 :)

答案 1 :(得分:1)

使用函数gzerror()记录错误类型。因为它是-2,所以它不会是文件结束错误。可能是以下任何错误。

Z_DATA_ERROR

读取数据时发生CRC错误;该文件已损坏。

Z_STREAM_ERROR

流无效,或处于无效状态。

Z_NEED_DICT

需要字典(参见inflateSetDictionary())。

Z_MEM_ERROR

可用于解压缩的内存不足。

答案 2 :(得分:1)

来自http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-gzread-1.html

  1. 如果返回为正,则是读取的字节数,您可以使用它将NULL终止符放在正确的位置。
  2. 如果返回代码为gzerror,您可以使用<0来确定错误是什么。