c语言 - 在此行中等于 2 是什么意思 fscanf (fi, "%d %d", &used,"a)==2?



我开始学习文件,但我并不完全理解它们是如何阅读的。

  1. 我的第一个问题是:在这一行中等于 2 是什么意思?

    fscanf(fi,"%d %d", &used,&quota) == 2
    

    它不应该等于EOF吗,它将如何理解程序已经结束?

  2. 一行中包含数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?

包含一行数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?

这是关于scanf家族的另一个有趣的事实。 给定呼叫

fscanf(fi, "%d %d", &used, &quota)

和输入行

10 20

它将成功读取 10 表示used和 20 表示quota,这可能是您的想法。 但是如果你给它输入

10
20

它也会非常高兴地阅读 10used和 20quota. 事实上,它也适用于输入

10
20

里面有一个空行。 此外,您(即调用fscanf的代码的作者(绝对无法确定输入是在一行上还是两行上,或者是什么。

不应该等于EOF,怎么理解程序已经到了尽头?

这是真的:如果fscanf在转换任何输入之前点击文件末尾,它会返回EOF,这是您可能想知道的事情。 但这并不是您可能想知道的唯一错误条件。

假设输入行显示

10 abc 20

在这种情况下,fscanf调用将返回 1,表示它能够读取used的值 10,但它无法读取任何quota的内容。

检查 2 的原因是(如您询问的代码中(是,只有当fscanf返回 2 时,它才会读取并转换两个变量的值。

查看手册页以了解fscanf

返回值

成功完成后,这些函数应返回数字 成功匹配和分配的输入项;这个数字可以是 如果早期匹配失败,则为零。

因此,在这种情况下,检查fscanf(fi,"%d %d", &used,&quota) == 2是确保从文件中正确读取usedquota


它不应该等于EOF吗,它将如何理解程序已经结束?

嗯,是的,但只有在这种情况下。同样,从手册页:

如果输入结束 在第一次转换(如果有(完成之前,并且没有 发生匹配失败,应返回 EOF。


一行中包含数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?

当您在格式字符串中放置一个空格(如此处"%d %d"(时,fscanf将跳过它遇到的所有空格(包括空格、n和其他字符(。这意味着,如果您输入1 21 21n2则所有三个输入都将毫无问题地读取。

最新更新