我正在尝试编写一个程序来解压缩已经使用运行长度编码压缩的文件。由于某些原因,每个字符都被多次打印到文件中。例如,如果输入文件包含1l1i1n...
我的输出文件显示llllllllll...
我试过将reps变量从for循环打印到终端,以确保它设置为正确的重复次数,甚至尝试使用fprintf,但得到的结果相同。我不知道这是什么,但这里一定有什么我不明白的?
顺便说一下,压缩文件是以二进制模式从主函数打开的。
int uncompress_file(FILE *fd_compressed, const char *fname_out)
{
FILE *fd_out;
if (fd_compressed == NULL) {
fprintf(stderr, ...);
return -1;
}
if ((fd_out = fopen(fname_out, "wb")) == NULL) {
fprintf(stderr, ...);
return -1;
}
unsigned char cur, reps;
int i = 0;
while (fread(&cur, sizeof(unsigned char), 1, fd_compressed) > 0) {
if (i % 2 == 0) {
reps = cur;
}
else {
for (int j = 0; j < reps; j++)
fwrite(&cur, sizeof(unsigned char), 1, fd_out);
}
i++;
}
fclose(fd_out);
return 0;
}
最佳答案
问题是你的线路reps = cur
。如果您的文件是1l1i1n
那么当我们第一次进入循环时,reps将被分配值1
。但这是ASCII1
,不是实际的数字1。ASCII中的1映射到小数点49,因此您将得到49l
。要将字符从ASCII数字转换为正确的int
值,您可以从中减去48,即reps = cur - 48
。
请注意,这与您的代码一起,仅在可能的最大数为9(没有两位数)时才有效。