【问题标题】:C Function to count the frequency of characters in a fileC函数计算文件中字符的频率
【发布时间】:2021-12-05 04:10:10
【问题描述】:

小背景,我正在编写一个 C 程序来使用 Huffman 代码对文件进行编码和解码。我无法让我的函数正确计算频率(它已经偏离了),我不知道为什么。该程序采用两个命令行参数,输入文件和输出文件。有问题的函数也采用相同的参数并返回指向无符号长数组的指针以供以后使用。 min 和 max 变量也将它们的结束值分配给全局变量以供以后使用。任何帮助将不胜感激!

unsigned long* printFreqTable(FILE* in, FILE* out)
{
  int i, j, k;
  unsigned long tCount = 0;
  unsigned long max = 0;
  int maxIndex;
  unsigned long min;
  int minIndex;
  /*unsigned long minControl;*/
  unsigned long freq[256];
  unsigned long* freqPtr;
  char c;
  printf("Entered printFreqTable()\n");
  while((c = getc(in)) != EOF)
    {
      if((c-'0') <= 255) {freq[c-'0']++;}
      if(freq[c-'0'] > max)
    {
      max = freq[c-'0'];
      maxIndex = c-'0';
    }
    }
  min = max;
  for(i = 0; i < 33; i++)
    {
      tCount += freq[i];
      if(freq[i] != 0) {fprintf(out, "\n=%d\t\t%2lu", i, freq[i]);}
      if(freq[i] < min && freq[i] > 0)
    {
      min = freq[i];
      minIndex = i;
    }
    }
  for(j = 33; j < 127; j++)
    {
      tCount += freq[j];
      if(freq[j] != 0) {fprintf(out, "\n%c\t\t%2lu", j, freq[j]);}
      if(freq[j] < min && freq[j] > 0)
    {
      min = freq[j];
      minIndex = j;
    }
    }
  for(k = 127; k < 256; k++)
    {
      tCount += freq[k];
      if(freq[k] != 0) {fprintf(out, "\n=%d\t\t%2lu", k, freq[k]);}
      if(freq[k] < min && freq[k] > 0)
    {
      min = freq[k];
      minIndex = k;
    }
    }
  freqPtr = freq;
  minFreqIndex = minIndex;
  maxFreqIndex = maxIndex;
  totalChars = tCount;
  fprintf(out, "\n\nTotal number of characters in file %lu", tCount);
  printf("Finished printFreqTable()\n");
  return freqPtr;
}

这是输入

a small sample string

这是输出


1        3
5        1
7        1
9        1
<        3
=        2
>        1
@        1
B        1
C        3
D        1
=159        -573673472
=160        1050929936
=161        1050929168
=162        1050930168
=163         2
=164        66306
=165        -575651989
=167        1994752
=168        1993312
=169        1993312
=171         5
=172        4091904
=173        4116480
=174        4114528
=175        4131552
=176        1994752
=177         3
=203        8192
=204        1178
=207        -573406864
=208         1
=209        -575568105
=212         9
=213        -575630015
=215        31
=216        -573403696
=217        47
=218        1331192865
=222        1050929936
=223        -575630898
=224        -573673472
=225        1050929936
=226        2147479968
=227        -575650745
=228         1
=229         0
=230        1050929120
=231        -575608588
=232        -575681824
=233        -579717286
=235        -575643587
=236        1050930096
=237         1
=238        1050929120
=239        10896419
=240        -573406912
=241        -573403696
=242         0
=243        1331192865
=244        66306
=245        10896419
=246         1
=247        33261
=250        2030928
=251        4096
=252        3968
=253        1638664235
=254        421271146
=255        1607359089

Total number of characters in file 3418115080132923

【问题讨论】:

  • 到底是什么问题?请描述确切的输入、预期行为和实际行为。还有你做了什么调试,你发现了什么?事情首先从哪里开始出错?
  • (c-'0') 毫无意义。试试(c)
  • A. Mitchev,第一次次调用req[c-'0']++;,你认为req[c-'0']在增量之前的值是多少? (提示:不一定是 0。)
  • @kaylum 所以我刚刚用我的程序发布了输入和当前输出。不幸的是,预期的输出尚未发布,所以我无法提供。但我相信你可以从输入中看出,输出是非常错误的哈哈。但是我使用打印语句来跟踪我的进度,不幸的是我在辅助机器(朋友的)上并且我常用的虚拟机已关闭,因此我目前无法使用 gdb。
  • @chux-ReinstateMonica 我可以肯定地告诉你,你正在把我带到某个地方,但我目前睡眠不足的大脑并没有太大帮助。你能详细说明一下吗?你是说这些值是空的吗?

标签: c encoding huffman-code


【解决方案1】:

正如@chux-ReinstateMonica 所指出的,我没有实例化数组,而且我不必要地使用“c-'0'”作为索引。此后我已对此进行了更改并解决了问题,感谢所有花时间提供帮助的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多