C 为什么fwrite每个字符都要写这么多次?

C 为什么fwrite每个字符都要写这么多次?,c,file,io,C,File,Io,我正在尝试编写一个程序来解压缩一个已经用游程编码压缩过的文件。由于某些原因,每个字符都会被多次打印到文件中。例如,如果输入文件包含1lI1N…我的输出文件显示llllllllll… 我尝试将reps变量从for循环打印到终端,以确保它设置为正确的重复次数,甚至尝试使用fprintf,但得到的结果相同。我不确定是什么,但一定有什么我不明白的地方 顺便说一下,压缩文件也是以二进制模式从主函数打开的 int uncompress_file(FILE *fd_compressed, const ch

我正在尝试编写一个程序来解压缩一个已经用游程编码压缩过的文件。由于某些原因,每个字符都会被多次打印到文件中。例如,如果输入文件包含
1lI1N…
我的输出文件显示
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;
  }
int解压缩文件(文件*fd\u压缩,常量字符*fname\u输出)
{
文件*fd_out;
如果(fd_compressed==NULL){
fprintf(标准格式,…);
返回-1;
}
如果((fd_out=fopen(fname_out,“wb”))==NULL){
fprintf(标准格式,…);
返回-1;
}
未签名字符cur,reps;
int i=0;
而(fread(&cur,sizeof(unsigned char),1,fd_compressed)>0){
如果(i%2==0){
reps=cur;
}
否则{
对于(int j=0;j
问题在于您的线路
reps=cur
。如果您的文件是
1l1in
,那么当我们第一次进入循环时,将为代表分配值
1
。但这是ASCII
1
,而不是实际的数字1。ASCII中的1映射到小数点49,因此您将得到49
l
。要将字符从ASCII数字转换为正确的
int
值,可以从中减去48,即
reps=cur-48


请注意,只有当可能的最大数字为9(无两位数)时,此选项和您的代码才起作用。

输入文件是否确实包含
“1l1n”
?如中所示,字符
'1'
(即字节0x31)?因为
'1'
1
不一样。啊,对C来说还是新的,所以在写它的时候,这就让我头晕目眩了。这就解决了这个问题。Thanks在计数和实际字符之间使用分隔符是使此操作适用于9个以上连续字符的最佳方法吗?当然,我也会编辑压缩的函数。这是一个选项。或者,将限制增加到255的一个简单改进是,不使用ASCII作为数字,只使用原始字节,因此1将是空字节(0x00),2将是0x01,3将是0x02,等等。这样,您就可以保持每个字节交替的简单性。尽管它确实有一个缺点,即压缩文件在文本编辑器中不再容易读取。