我需要提出一个程序来读取数字列表并生成值的直方图。这些数字在文本文件中逐行列出。因此,我认为使用fscanf是合适的,因为它在输入空白字符时停止读取。但是,我在fgets或fscanf之间根本不确定。我选择fscanf的另一个原因是因为fscanf只是将读取的数字分配给变量而不是数组。我不需要数组,因为我只想检查用条件读取的每个数字并增加相应的计数器。无论如何,代码无法工作,并且在试图追踪错误时,我打印出它读取的数字,而且我不知道为什么读取的数字与文本文件中的数字不同。预期的执行跟踪是:
1- 9: XXXX
10-19: XXXXXXXXXXXXXXXXXXXX
20-29: XXXXXXXXX
这是我的代码:
#include <stdio.h>
int main ()
{
FILE *ptr_file;
int count [10] = {0}, a = 0;
ptr_file = fopen("histogram-input.txt", "r");
if ( !ptr_file )
return 1;
while ( fgetc(ptr_file) != EOF )
{
fscanf (ptr_file, "%d", &a);
printf("%d\n", a);
if ( a >=1 && a <= 9 )
{
count [0] ++;
}
else if ( a >= 10 && a <= 19 )
{
count [1] ++;
}
else if ( a >= 20 && a <= 29 )
{
count [2] ++;
}
else if ( a >= 30 && a <= 39 )
{
count [3] ++;
}
else if ( a >= 40 && a <= 49 )
{
count [4] ++;
}
else if ( a >= 50 && a <= 59 )
{
count [5] ++;
}
else if ( a >= 60 && a <= 69 )
{
count [6] ++;
}
else if ( a >= 70 && a <= 79 )
{
count [7] ++;
}
else if ( a >= 80 && a <= 89 )
{
count [8] ++;
}
else if ( a >= 90 && a <= 99 )
{
count [9] ++;
}
}
fclose ( ptr_file );
for ( int k = 0; k < 10; k++ )
{
if ( k == 0 )
{
printf("1-9: ");
for ( int h = 1; h <= count [0]; h++ )
{
printf("X");
}
printf("\n");
}
else
{
printf("%d-%d: ", k*10, k*10 + 9 );
for ( int h = 1; h <= count [k]; h++ )
{
printf("X");
}
printf("\n");
}
}
return 0;
}
我程序的直方图输出中的我的Xs持续了太多次。
这是我执行追踪的一小部分:
12
45
95
72
28
7
我的文本文件中的第一个数字是:
1
57
51
31
68
98
6
我不明白为什么阅读的数字不同。有人可以帮我吗?谢谢!
答案 0 :(得分:1)
你有两个问题:
每次while循环重复时,都会执行fgetc()
从文件中读取字符,然后执行fscanf()
读取整数。 fgetc()
会干扰fscanf()
。
在while循环中有一个额外的for循环。这基本上将每个数字计算100次。