c - 为什么要检查函数中 fscanf 返回值 < 1?

标签 c arrays file-io

有人给我一个使用 fscanf 来解决的问题,其中指出了以下内容:

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

解决方案如下所述。如果您扫描文件中的每个整数,为什么 fscanf 返回值 < 1?由于 fscanf 返回扫描的元素数量,它不应该 > 0 吗?

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

最佳答案

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

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

如果fscanf未能读取整数,则返回(它返回扫描的项目数)。因此,此时该函数将返回(a)

如果你得到一个正整数,这意味着你成功读入该值并且循环将继续。

<小时/>

(a) 您可能应该在此处break 而不是返回,因为文件并未按目前的方式关闭。

关于c - 为什么要检查函数中 fscanf 返回值 < 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47067938/

相关文章:

javascript - 将整数与字符串分开,并将整数除以常量。 (JS)

javascript - 无法读取未定义的属性 'undefined',但我确定 var 是有效的

c - 管道输出的重复

c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?

c - 结构中数组的值仍在变化

c - 如何在trie中将所有 child 设置为NULL

java - 正则表达式拆分 - 但包括换行符 - 包括 CR LF

java - 目录递归 - 如果第一个文件遇到的是目录会发生什么

c# - 为什么 System.IO.File 类是静态的

java - java FileDescriptor .sync() 用于*读取*文件的逆向