为什么要检查fscanf返回值< 1在一个功能?

时间:2017-11-02 05:04:35

标签: c arrays file-io

我使用fscanf解决了一个问题,其中说明了以下内容:

编写一个函数来初始化大小为SIZE的数组x,并使用从文本文件中读取的整数。该函数接收文件名作为参数。

解决方案陈述如下。为什么fscanf会返回一个值< 1,如果您正在扫描文件中的每个整数?不应该是> 0,因为fscanf返回扫描的元素数量?

void init (char *name)
{
    FILE    *fp;
    int i;

    fp = fopen (name, "r");
    if (fp == NULL)
    {
        printf ("no file\n");
        return;
    }

    for (i = 0; i < SIZE; i++)
    {
        if (fscanf (fp, "%d", &x[i]) < 1)
        {
            printf ("got %d numbers\n", i);
            return;
        }
    }

    fclose (fp);
    return;
}

2 个答案:

答案 0 :(得分:2)

您似乎误解了代码的意图:

for (i = 0; i < SIZE; i++)
{
    if (fscanf (fp, "%d", &x[i]) < 1)
    {
        printf ("got %d numbers\n", i);
        return;
    }
}

如果fscanf 失败读取整数(它返回扫描的项目数),这将会返回。因此,此时,函数将返回(a)

如果得到正整数,则表示您已成功读入该值,并且循环将继续。

(a)你可能应该break而不是返回,因为文件没有像现在那样被关闭。

答案 1 :(得分:0)

  

为什么fscanf会返回一个值&lt; 1,如果您正在扫描文件中的每个整数?

1返回:

成功扫描一个 int

int代码循环读取其他0

检测到非数字非空白输入时

EOF

在文件结尾处

EOFEOF是一些负值)。

if (fscanf (fp, "%d", &x[i]) < 1)输入错误(罕见)。

使用fastlane match,分支被视为最后发生的3个条件之一 - 可能是文件结束。