我开始学习文件,但我并不完全理解它们是如何阅读的。
-
我的第一个问题是:在这一行中等于 2 是什么意思?
fscanf(fi,"%d %d", &used,"a) == 2
它不应该等于EOF吗,它将如何理解程序已经结束?
-
一行中包含数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?
包含一行数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?
这是关于scanf
家族的另一个有趣的事实。 给定呼叫
fscanf(fi, "%d %d", &used, "a)
和输入行
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,"a) == 2
是确保从文件中正确读取used
和quota
。
它不应该等于EOF吗,它将如何理解程序已经结束?
嗯,是的,但只有在这种情况下。同样,从手册页:
如果输入结束 在第一次转换(如果有(完成之前,并且没有 发生匹配失败,应返回 EOF。
一行中包含数据的文件与包含多行数据的文件有何不同。例如,它如何读取,如何仅读取第一行或第二行?
当您在格式字符串中放置一个空格(如此处"%d %d"
(时,fscanf
将跳过它遇到的所有空格(包括空格、n
和其他字符(。这意味着,如果您输入1 2
或1 2
或1n2
则所有三个输入都将毫无问题地读取。