无法对文本文件中的整数进行计数和求和
Having Trouble Counting and Summing Integers from Text File
抱歉我是新手
这道题我用的是C语言,库stdlio.h和stdlib.h。
问题
所以有一个问题要求我:
- 以读取模式打开名为 'numbers.txt' 的文本文件。这个文本文件
里面有6个整数。
- 使用循环从该文本文件中读取 6 个整数。
- 计算并显示这 6 个整数的总和和平均值。
文本文件 'numbers.txt' 包含整数:5、10、15、20、25。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a, num, sum = 0;
float avg;
for (a = 0; a < 6; a++) {
fscanf(n, "%d", &num);
sum = sum + num;
}
avg = sum / (a - 1);
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
问题的另一个变体是我需要使用 while 循环来读取文本文件中的整数。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a = 0, num, sum = 0;
float avg;
while (fscanf(n, "%d", &num) != EOF) {
fscanf(n, "%d", &num);
sum = sum + num;
a++;
}
avg = sum / a;
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
问题
当我运行上面的每个程序时,我期望这个输出:
Sum = 75
Average = 15.00
但是我得到的是这个(对于第一个代码):
Sum = 100
Average 20.00
还有这个(第二个代码):
Sum = 55
Average = 18.00
我怎样才能从这两个程序获得正确的输出?
我再次为这个问题的基础性道歉。尽管如此,我们将不胜感激。
在第一个中,您尝试读取一对多数字,但由于只有 5 个数字,最后一个数字被添加到您的总和中两次,所以您最终添加了一个额外的 25
求和得到 100.
在第二个代码中,在读取最后一个数字后,到达了文件末尾,所以你的代码没有机会添加最后一个读取的数字,所以你错过了添加 25
到你的总和
你的第一个代码更接近了,只需将 for 循环更改为仅迭代 5 次
这是我的观察,
案例2 : 问题出在下面两行代码
while (fscanf(n, "%d", &num) != EOF) { /* this is fine, scanf() stored read int into num */
fscanf(n, "%d", &num); /* this is not needed as overwrites previous num, just remove it */
/* some code */
}
还有这个
avg = sum / a;
没有得到您预期的结果,因为 sum/a
结果为整数,但您将其分配给 avg
,即 float
。克服这个问题的一种方法是像下面这样进行类型转换
avg = (float)(sum / a);
示例代码:
int main(void) {
FILE *n;
n = fopen("numbers.txt", "r"); /* always do error handling to make more robust code */
if(n == 0) {
@TODO error handling */
}
int a = 0, num, sum = 0;
float avg;
while (fscanf(n,"%d", &num) != EOF) {
//fscanf(n, "%d", &num);// remove this
sum = sum + num;
a++;
}
avg = (float)(sum / a);// typecast it
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
return 0;
}
案例 1:这里
for (a = 0; a < 6; a++)
旋转固定次数的循环目前可能不是问题,但如果您事先不知道有多少个整数文件,它就会产生问题。所以最好旋转循环直到 EOF
。例如
for (a = 0; ; a++) {
if(fscanf(n, "%d", &num) == 1) /* compare with return value */
sum = sum + num;
else
break;
}
抱歉我是新手
这道题我用的是C语言,库stdlio.h和stdlib.h。
问题
所以有一个问题要求我:
- 以读取模式打开名为 'numbers.txt' 的文本文件。这个文本文件 里面有6个整数。
- 使用循环从该文本文件中读取 6 个整数。
- 计算并显示这 6 个整数的总和和平均值。
文本文件 'numbers.txt' 包含整数:5、10、15、20、25。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a, num, sum = 0;
float avg;
for (a = 0; a < 6; a++) {
fscanf(n, "%d", &num);
sum = sum + num;
}
avg = sum / (a - 1);
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
问题的另一个变体是我需要使用 while 循环来读取文本文件中的整数。
这是我的代码:
FILE *n;
n = fopen("numbers.txt", "r");
int a = 0, num, sum = 0;
float avg;
while (fscanf(n, "%d", &num) != EOF) {
fscanf(n, "%d", &num);
sum = sum + num;
a++;
}
avg = sum / a;
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
问题
当我运行上面的每个程序时,我期望这个输出:
Sum = 75
Average = 15.00
但是我得到的是这个(对于第一个代码):
Sum = 100
Average 20.00
还有这个(第二个代码):
Sum = 55
Average = 18.00
我怎样才能从这两个程序获得正确的输出?
我再次为这个问题的基础性道歉。尽管如此,我们将不胜感激。
在第一个中,您尝试读取一对多数字,但由于只有 5 个数字,最后一个数字被添加到您的总和中两次,所以您最终添加了一个额外的 25
求和得到 100.
在第二个代码中,在读取最后一个数字后,到达了文件末尾,所以你的代码没有机会添加最后一个读取的数字,所以你错过了添加 25
到你的总和
你的第一个代码更接近了,只需将 for 循环更改为仅迭代 5 次
这是我的观察,
案例2 : 问题出在下面两行代码
while (fscanf(n, "%d", &num) != EOF) { /* this is fine, scanf() stored read int into num */
fscanf(n, "%d", &num); /* this is not needed as overwrites previous num, just remove it */
/* some code */
}
还有这个
avg = sum / a;
没有得到您预期的结果,因为 sum/a
结果为整数,但您将其分配给 avg
,即 float
。克服这个问题的一种方法是像下面这样进行类型转换
avg = (float)(sum / a);
示例代码:
int main(void) {
FILE *n;
n = fopen("numbers.txt", "r"); /* always do error handling to make more robust code */
if(n == 0) {
@TODO error handling */
}
int a = 0, num, sum = 0;
float avg;
while (fscanf(n,"%d", &num) != EOF) {
//fscanf(n, "%d", &num);// remove this
sum = sum + num;
a++;
}
avg = (float)(sum / a);// typecast it
printf("Sum = %d\nAverage = %.2f\n\n", sum, avg);
fclose(n);
return 0;
}
案例 1:这里
for (a = 0; a < 6; a++)
旋转固定次数的循环目前可能不是问题,但如果您事先不知道有多少个整数文件,它就会产生问题。所以最好旋转循环直到 EOF
。例如
for (a = 0; ; a++) {
if(fscanf(n, "%d", &num) == 1) /* compare with return value */
sum = sum + num;
else
break;
}