【问题标题】:zlib Compression Errorzlib 压缩错误
【发布时间】:2012-11-03 08:12:13
【问题描述】:

我正在使用从教程中获取的这段代码 sn-p。它旨在压缩输入文件中的数据并将其放入输出文件中。但是,它在运行时会出现分段错误:

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;
}

它是这样称呼的:

int main()
{
    if (map_Compress("maps/main.map", "maps/main.mz") < 0)
    {
        printf("Compression failed, couldn't open file(s)\n");
    }
    return 0;
}

这个段错误是怎么回事?调用它时我在屏幕上看到的只是:

0
1

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

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

【问题讨论】:

  • 所以您打算一次读取文件 1 个字节?您可能希望稍微调整一下缓冲区的大小(例如unsigned char in buffer[1024];)。
  • printf() 转换说明符不匹配,传入的是什么。num_readtotal_read 应声明为 size_t
  • 代码在这里运行良好。由于在调用map_Compress() 之前发生了一些不好的事情,您很可能目睹了一个错误功能。
  • ^^不,1字节只是为了测试:)
  • 这个问题一直困扰着我,我无法让它消失......

标签: c compression zlib


【解决方案1】:

显示的代码没有任何问题会导致崩溃。它必须在其他地方发生。你没有调试器来告诉你崩溃的地方吗?

有几个小问题需要修复。对于可移植性,infile 应与NULL 进行比较,outfile 应与Z_NULL 进行比较,而不是使用!。如果fopen() 失败并且gzopen() 成功,您应该在错误返回时gzclose() 以避免巨大的内存泄漏。反之亦然。 printf 格式应为 %lu。 (您需要稍微提高编译器警告级别。)printf 可能应该在添加到total_read 之后,因为最后打印的数字不是读取的实际数字。 map_compress() 应该返回 unsigned long,而不是 int,因为您返回的是 total_read。您在 fread() 中有一个无关的 &amp; — 不会造成伤害,但可能会造成混淆,如果您将 inbuffer 更改为分配的缓冲区,则会导致失败。

您的代码已正确配置以支持大于一个字节的输入缓冲区。为了效率,它应该更大。至少 4K 或 8K。

【讨论】:

  • 是的,谢谢。我故意将缓冲区更改为 1 字节作为测试,因为 128 字节不起作用。我总是要改变它:)谢谢你的提示......
  • map_compress() 不应返回无符号长整数,因为我返回 -1 表示失败:P 但我知道它确实应该与我返回的变量匹配
【解决方案2】:

而不是

fread(&inbuffer, 1

试试

fread(inbuffer, 1

这里:

gzwrite(outfile, inbuffer, num_read);

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

【讨论】:

  • “&”不应该也不会产生影响。缓冲区中有多少字节并不重要。
  • '&' 在那里也没有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多