无法对文本文件中的整数进行计数和求和

Having Trouble Counting and Summing Integers from Text File

抱歉我是新手

这道题我用的是C语言,库stdlio.h和stdlib.h。


问题

所以有一个问题要求我:

  1. 以读取模式打开名为 'numbers.txt' 的文本文件。这个文本文件 里面有6个整数。
  2. 使用循环从该文本文件中读取 6 个整数。
  3. 计算并显示这 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;
}