所以我在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,我不知道为什么。任何帮助将不胜感激。
答案 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:
gzerror
,您可以使用<0
来确定错误是什么。