【发布时间】: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