我正在使用我从教程中抓取的代码片段。它的目的是压缩输入文件中的数据并将其放入输出文件中。然而,它在运行时会出现分段故障:
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然后程序崩溃了..。这里出了什么问题?我的输入文件中有一些我放在其中的垃圾内容,那么函数不应该将数据压缩到输出文件中吗?
请帮帮忙,我确信这是一个我忽略了的简单问题:)
发布于 2012-11-04 02:53:53
所显示的代码没有任何会导致崩溃的错误。这肯定是在别处发生的。你不是有一个调试器来告诉你它在哪里崩溃了吗?
有几个小问题需要解决。为了便于移植,应该将infile与NULL进行比较,将outfile与Z_NULL进行比较,而不是使用!。如果fopen()失败而gzopen()成功,您应该在返回错误时执行gzclose()操作,以避免发生严重的内存泄漏。反之亦然。printf格式应为%lu。(您需要稍微提高编译器的警告级别。)printf应该在添加到total_read之后,因为打印的最后一个数字将不是读取的实际数字。map_compress()应该返回unsigned long,而不是int,因为您返回的是total_read。您在fread()中有一个无关的& --不会造成伤害,但可能会造成混淆,如果您将inbuffer更改为已分配的缓冲区,则会导致失败。
您的代码被适当地操纵,以支持比一个字节更大的输入缓冲区。为了提高效率,它应该大得多。至少4K或8K。
发布于 2012-11-03 16:27:35
而不是
fread(&inbuffer, 1试一试
fread(inbuffer, 1这里:
gzwrite(outfile, inbuffer, num_read);我不知道这个函数是做什么的,但是你可能试图从只包含一个字节的inbuffer中读取num_read字节。
https://stackoverflow.com/questions/13207312
复制相似问题