0

所以我在 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;
}

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

4

3 回答 3

6

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

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

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

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

此外,您假定的 .gz-archive 具有扩展名有点奇怪.txt

阅读文档,文档规则。:)

于 2012-09-17T12:08:36.007 回答
1

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

Z_DATA_ERROR

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

Z_STREAM_ERROR

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

Z_NEED_DICT

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

Z_MEM_ERROR

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

于 2012-09-17T12:05:51.270 回答
1

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

  1. 如果返回为正,则为读取的字节数,您可以使用它来将 NULL 终止符放在正确的位置。
  2. gzerror如果返回代码是<0为了找出错误是什么,您可以使用。
于 2012-09-17T12:15:22.823 回答