代码之家  ›  专栏  ›  技术社区  ›  lefrost

对文本文件中的整数进行计数和求和时遇到问题

  •  -1
  • lefrost  · 技术社区  · 7 年前

    对不起,我是个新手。

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


    问题

    所以有个问题要问我:

    1. 打开名为“numbers”的文本文件。txt’处于读取模式。这个文本文件 其中有6个整数。
    2. 使用循环读取该文本文件中的6个整数。
    3. 计算并显示这6个整数的总和和平均值。

    文本文件的编号。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 回复  |  直到 7 年前
        1
  •  0
  •   smac89    7 年前

    在第一个例子中,你试图读取一对多的数字,但由于只有5个数字,最后一个数字被添加两次到你的总和中,所以你最后添加了一个额外的数字 25 加起来等于100。

    在第二个代码中,在读取最后一个数字后,到达了文件的末尾,因此您的代码没有获得添加最后一个读取数字的机会,因此您错过了添加 25 你的总数。


    您与第一个代码更接近了,只需将for循环更改为仅迭代5次

        2
  •  0
  •   Achal    6 年前

    这是我的观察结果,

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