【问题标题】:fscanf return valuefscanf 返回值
【发布时间】:2013-03-10 02:53:11
【问题描述】:

fscanf 在读取文件中的数据时返回什么。例如,

int number1, number2, number3, number4, c;

c = fscanf (spFile, "%d", &number1);
//c will be 1 in this case.

c = fscanf (spFile, "%d %d %d %d", &number1, &number1, &number3, &number4);
//in this case, c will return 4.

我只想知道为什么它会根据参数的数量返回这样的值。

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    来自manpage for the Xscanf family的函数:

    成功完成后,这些函数将返回 成功匹配并分配输入项;这个数字可以为零 在早期匹配失败的情况下。如果输入在之前结束 第一次匹配失败或转换,返回EOF。如果一个 发生读取错误,设置流的错误指示器,EOF 应返回,并且 errno 应设置为 指出错误

    因此,您对fscanf 的第一次调用返回 1,因为一个输入项 (&number1) 与格式说明符 %d 成功匹配。您对 fscanf 的第二次调用返回 4,因为所有 4 个参数都匹配。

    【讨论】:

    • 那么编译器在第一次匹配失败时会打印 EOF 吗?即 printf("%d", c);
    • fscanf 如果在匹配任何参数之前失败,将返回 EOF。在 C 中,EOF 是一个实现定义的值,您可以使用宏 EOF 对其进行测试。所以你可以说if c == EOF { /* do something */ }作为你的返回值c
    • +1 EOF 返回适用于我的问题。我想从 stdio 读取一个文本文件,然后将其内容写入终端。 while (fscanf(stdin, "%s", buf)!=EOF){ printf("value read: [%s]\n", buf); }
    【解决方案2】:

    我引用自 cplusplus.com

    成功时,函数返回参数的项目数 列表成功填写。这个计数可以匹配预期的数量 由于匹配失败,项目或更少(甚至为零),读数 错误,或到达文件末尾。

    如果发生读取错误或到达文件结尾同时 阅读时,设置了正确的指标(feof 或 ferror)。而且,如果有的话 在成功读取任何数据之前发生,返回 EOF。

    --编辑--

    如果你的意图是确定读取到字符串的字节数。

    int bytes;
    char str[80];
    fscanf (stdin, "%s%n",str,&bytes);
    printf("Number of bytes read = %d",bytes);
    

    【讨论】:

      【解决方案3】:

      来自manual 页面:

      *这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。 *

      因此,如果能够从文件中读取一个整数,则第一个返回 1,如果能够从文件中读取 4 个整数,则第二个返回 4。

      【讨论】:

        【解决方案4】:

        这恰好是一个非常直截了当的问题,并且在我之前由 charles 和 ed 恰当地回答了。但是他们没有提到下次遇到困难时应该在哪里寻找这些东西。

        首先是问题—— fscanf 属于格式化输入(扫描)函数系列,它们应该读取输入并报告读取的数据的一些信息,如字节或获得适当输入读取并成功分配的项目(变量地址)计数.

        这里 fscanf 应该使用函数调用中提供的格式字符串检查输入文件中的匹配项,并相应地分配(按位置顺序)变量 - 带有值的地址,一旦完成,它将返回总数计算它所做的成功分配的数量。因此 1 和 next 的结果是 4(假设输入正确)。

        第二部分:去哪里看? -- 此类功能的详细描述很容易在您的手册页或 posix 文档中找到(如果您参考)。

        如果您注意到的话,前两个答案还包含手册页的一小部分摘录。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          返回值不取决于fscanf的参数个数,它取决于fscanf成功扫描的值个数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-01
            • 2021-03-02
            • 2016-12-17
            相关资源
            最近更新 更多