首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zlib压缩错误

zlib压缩错误
EN

Stack Overflow用户
提问于 2012-11-03 16:12:14
回答 2查看 1.5K关注 0票数 0

我正在使用我从教程中抓取的代码片段。它的目的是压缩输入文件中的数据并将其放入输出文件中。然而,它在运行时会出现分段故障:

代码语言:javascript
复制
int map_Compress(char *inmapfile, char *outmapfile)
{
    FILE *infile = fopen(inmapfile, "rb");
    gzFile outfile = gzopen(outmapfile, "wb");
    if (!infile || !outfile) return -1;
    char inbuffer[1];
    int num_read = 0;
    unsigned long total_read = 0;
    while ((num_read = fread(&inbuffer, 1, sizeof(inbuffer), infile)) > 0)
    {
        printf("%d\n",total_read);
        total_read += num_read;
        gzwrite(outfile, inbuffer, num_read);
    }
    fclose(infile);
    gzclose(outfile);
    return total_read;
}

它的名字是这样的:

代码语言:javascript
复制
int main()
{
    if (map_Compress("maps/main.map", "maps/main.mz") < 0)
    {
        printf("Compression failed, couldn't open file(s)\n");
    }
    return 0;
}

这个段错误是怎么回事?当调用此函数时,我在屏幕上看到的是:

代码语言:javascript
复制
0
1

然后程序崩溃了..。这里出了什么问题?我的输入文件中有一些我放在其中的垃圾内容,那么函数不应该将数据压缩到输出文件中吗?

请帮帮忙,我确信这是一个我忽略了的简单问题:)

EN

回答 2

Stack Overflow用户

发布于 2012-11-04 02:53:53

所显示的代码没有任何会导致崩溃的错误。这肯定是在别处发生的。你不是有一个调试器来告诉你它在哪里崩溃了吗?

有几个小问题需要解决。为了便于移植,应该将infileNULL进行比较,将outfileZ_NULL进行比较,而不是使用!。如果fopen()失败而gzopen()成功,您应该在返回错误时执行gzclose()操作,以避免发生严重的内存泄漏。反之亦然。printf格式应为%lu。(您需要稍微提高编译器的警告级别。)printf应该在添加到total_read之后,因为打印的最后一个数字将不是读取的实际数字。map_compress()应该返回unsigned long,而不是int,因为您返回的是total_read。您在fread()中有一个无关的& --不会造成伤害,但可能会造成混淆,如果您将inbuffer更改为已分配的缓冲区,则会导致失败。

您的代码被适当地操纵,以支持比一个字节更大的输入缓冲区。为了提高效率,它应该大得多。至少4K或8K。

票数 2
EN

Stack Overflow用户

发布于 2012-11-03 16:27:35

而不是

代码语言:javascript
复制
fread(&inbuffer, 1

试一试

代码语言:javascript
复制
fread(inbuffer, 1

这里:

代码语言:javascript
复制
gzwrite(outfile, inbuffer, num_read);

我不知道这个函数是做什么的,但是你可能试图从只包含一个字节的inbuffer中读取num_read字节。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13207312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档