从文本文件中计算和求和整数

时间:2017-11-11 03:41:56

标签: c text-files stdio

很抱歉这样的新手。

对于这个问题,我使用了C语言,以及库stdlio.h和stdlib.h。

问题

所以有一个问题要求我:

  1. 打开一个名为' numbers.txt'的文本文件。在阅读模式下。这个文本文件 其中有6个整数。
  2. 使用循环从该文本文件中读取6个整数。
  3. 计算并显示这6个整数的总数和平均值。
  4. 文本文件' 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
    

    我如何从这两个程序中获得正确的输出?

    我再次为这个问题的基本内容道歉。尽管如此,任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

在第一个中,您试图读取一对多的数字,但由于只有5个数字,最后一个数字被添加到您的总和两次,因此您最终添加了额外的25得到100分。

在第二个代码中,在读完最后一个数字后,文件的末尾已到达,因此您的代码没有机会添加上次读取的数字,因此您错过了向您的总和添加25

您与第一个代码的距离越近,只需将for循环更改为仅迭代5次

答案 1 :(得分:0)

这是我的观察,

案例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;
}