0

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

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

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

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

4

2 回答 2

2

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

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

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

于 2012-11-03T18:53:52.890 回答
-3

代替

fread(&inbuffer, 1

尝试

fread(inbuffer, 1

这里:

gzwrite(outfile, inbuffer, num_read);

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

于 2012-11-03T08:27:34.817 回答