如何读取文件末尾的数字?

时间:2014-02-08 07:38:11

标签: c do-while

我有以下程序:

#include <stdio.h>      // printf, scanf definitions //
#include <math.h>       // sqrt function //


int main(void)
{
    double number;      // input- a number of a set //
    double avg;         // output - average //
    double sdev;        // output - standard deviation //
    double numSq;       // output - input squred //

    int count = 0;      // number of numbers counter //
    int status;         // status of scanf function //
    avg = 0;
    numSq = 0;

    do{
        status = scanf("%lf", &number);

        // Testing Purposes //
       // printf("%f\n", number);

        if (status == 1 && number !=EOF)
        {
            if ( number >=0)
            {

            avg += number;
            numSq += number * number;
            count +=1;
            }
            else if( number <0)
            {
                avg -= number;
                numSq += (number * number);
                count +=1;
            }
        }
        // Make an else for negative numbers and if scanf fails //
       }
       while (number !=EOF );

       avg = avg / count;
       numSq = numSq / count;  
       sdev = sqrt(numSq - (avg * avg));

       printf("The average is %.4f \n", avg);
       printf("The standard deviation is %.4f \n", sdev);

       return 0;
}

我还有一个名为data.txt的文本文件,其中包含:

1.0
1.2 
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0

程序编译后,我运行:
./standard < data.txt > results.txt
但没有任何反应!带有闪烁点的空白终端,如下图所示:

我的猜测是程序卡在循环中,但为什么呢?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

1.我们可以找到文件的位置结尾但无法检索文件结尾的值。 2.我们可以使用scanf系列函数的返回状态。在你的情况下我们应该运行循环状态!= - 1。 3.我们可以使用scanf读取重定向文件的输入。 4.以下代码可以帮助你。

#include <stdio.h>      // printf, scanf definitions //
#include <math.h>       // sqrt function //


int main(void)
{
    double number=0;      // input- a number of a set //
    double avg;         // output - average //
    double sdev;        // output - standard deviation //
    double numSq;       // output - input squred //

    int count = 0;      // number of numbers counter //
    int status;         // status of scanf function //
    avg = 0;
    numSq = 0;
        FILE *fp=NULL;
        fp=fopen("data.txt","r");
    do{
        //status = scanf("%lf", &number);
        status=fscanf(fp,"%lf", &number);
        printf("status:%d number:%lf\n",status,number);
        sleep(1);

        // Testing Purposes //
       // printf("%f\n", number);

        if (status == 1 && number !=EOF)
        {
            if ( number >=0)
            {

 avg += number;
            numSq += number * number;
            count +=1;
            }
            else if( number <0)
            {
                avg -= number;
                numSq += (number * number);
                count +=1;
            }
        }
        // Make an else for negative numbers and if scanf fails //
       }
       while (status !=-1 );
        avg = avg / count;
       numSq = numSq / count;
       sdev = sqrt(numSq - (avg * avg));

       printf("The average is %.4f \n", avg);
       printf("The standard deviation is %.4f \n", sdev);

       return 0;
}

答案 1 :(得分:1)

您在numberEOF之间的比较没有意义,如果到达文件末尾,scanf将不会将number设置为任何特定值。相反,它将返回 EOF

因此,您应该测试以确定文件结尾为status == EOF

事实上,如果status != 1,你可能应该突破循环,因为这意味着文件的结尾或者提供了无效的输入。在后一种情况下尝试并进行适当的错误报告。