了解EOF

时间:2013-10-17 02:49:57

标签: c arrays eof

我有一个函数可以将文件中的双打扫描到单独的数组中,其中双精度数在它们被扫描的数组中交替。

它在很大程度上起作用,但我还想添加计算扫描多少双打的能力,无论ARR_SIZE如何,所以我可以显示一个警告,表示未使用多少双打来增加1500以上的sigSize计数器。

我的尝试只是从条件中移除ARR_SIZE内容,或移动它,所以我可以添加第三个计数器,但这会使我的结果出错。此外,如果我使用键盘而不是文件输入输入,它会自动增加到1500.

总的来说,我似乎对如何使用EOF缺乏明确的理解,任何帮助都将不胜感激!

ARR_SIZE是1500

Size read_array(double array1[], double array2[])
{
    Size size = {0, 0};

    int i = 0;

    int status1 = 0;
    int status2 = 0;

    while(size.sigSize1 < ARR_SIZE && size.sigSize2 < ARR_SIZE && 
         (status1 != EOF || status2 != EOF))
    {

        status1 = scanf("%lf", &array1[i]);

        if(status1 != EOF)
        {
            size.sigSize1++;
        }        

        status2 = scanf("%lf", &array2[i]);

        if(status2 != EOF)
        {
            size.sigSize2++;
        }

        i++;

    }

    return size;
}

1 个答案:

答案 0 :(得分:1)

了解EOF

scanf()函数报告成功分配了多少个值,如果在阅读其他任何内容之前遇到EOF,则报告EOF。

这里测试的正确方法是if (status1 != 1),它可以防止输入中的杂散字母数字或其他非数字字符。目前,您的代码将无限循环,最终崩溃,而不是发现问题。

修复代码

由于这不是SSCCE(Short, Self-Contained, Correct Example),我们必须猜测Size类型的内容。但是,我们可以处理更多这样的事情:

#include <stdio.h>
#include <limits.h>

typedef struct Size
{
    int sigSize1;
    int sigSize2;
    int sigSize3;
    int sigSize4;
} Size;

enum { ARR_SIZE = 15 };  // 1500 per question

static Size read_array(double array1[], double array2[])
{
    Size size = {0, 0, 0, 0};

    for (int i = 0; i < INT_MAX; i++)
    {
        double d;

        int status1 = scanf("%lf", &d);

        if (status1 != 1)
            break;
        if (i < ARR_SIZE)
        {
            array1[i] = d;
            size.sigSize1++;
        }
        else
            size.sigSize3++;

        int status2 = scanf("%lf", &d);

        if (status2 != 1)
            break;
        if (i < ARR_SIZE)
        {
            array2[i] = d;
            size.sigSize2++;
        }
        else
            size.sigSize4++;
    }

    return size;
}

int main(void)
{
    double a1[ARR_SIZE];
    double a2[ARR_SIZE];
    Size size = read_array(a1, a2);
    printf("In a1: %d; in a2: %d; missed from a1: %d; missed from a2: %d\n",
           size.sigSize1, size.sigSize2, size.sigSize3, size.sigSize4);
    return 0;
}

给定一个数据文件(data3):

12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
35.43

程序(xs)的输出是:

$ ./xs < data3 | so
In a1: 9; in a2: 8; missed from a1: 0; missed from a2: 0
$ cat data3 data3 data3 data3 data3 | ./xs | so
In a1: 15; in a2: 15; missed from a1: 28; missed from a2: 27
$