2012-11-03 314 views
0

我正在使用我从教程中抓取的这段代码片段。它旨在压缩来自输入文件的数据并将其放入输出文件。然而,它虽然运行时,给出了一个分段错误:zlib压缩错误

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 

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

请帮帮忙,我敢肯定,这是一个简单的问题,我已经忽略了:)

+0

所以你打算一次读取文件1字节?你可能想要调整缓冲区的大小(例如,在缓冲区[1024];'中的无符号字符)。 – WhozCraig

+0

'printf()'转换说明符不匹配,传入的内容是'num_read'和'total_read'应声明为'size_t'。 – alk

+0

这里的代码运行良好。由于在调用'map_Compress()'之前发生的不好的事情,最有可能的是你会目睹一个不正常的函数。 – alk

回答

-3

代替

fread(&inbuffer, 1 

尝试

fread(inbuffer, 1 

这里:

gzwrite(outfile, inbuffer, num_read); 

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

+0

'&'不应该也没有区别。它不关心缓冲区中有多少个字节。 – phillid

+0

'&'也没有意义 –

2

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

有几件小事情要修复。为便于携带,infile应该与NULL比较,outfile应该与Z_NULL比较,而不是使用!。如果fopen()失败并且gzopen()成功,则应该在错误返回上应该gzclose()以避免巨大的内存泄漏。反之亦然。 printf格式应为%lu。 (您需要稍微调整一下编译器的警告级别。)printf应该加在total_read之后,因为最后打印的号码不会是实际读取的数字。 map_compress()应返回unsigned long,而不是int,因为您要退回total_readfread()中有一个无关的& - 不会伤害,但会造成混淆,如果将inbuffer更改为分配的缓冲区,将导致失败。

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

+0

是的,谢谢你。由于128字节无法正常工作,我故意将缓冲区更改为1个字节作为测试。我总是会改变它:)谢谢你的提示.... – phillid

+0

map_compress()不应该返回一个无符号的long,因为我返回-1失败:P但我明白它真的应该匹配变量I回来了 – phillid