我开始学习文件,但我并不完全了解它们的读取方式。
我的第一个问题是:在这一行中等于2意味着什么?
fscanf(fi,"%d %d", &used,"a) == 2
这不等于EOF,它将如何理解该程序已经结束?
一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?
答案 0 :(得分:1)
返回值
成功完成后,这些功能应返回数字 成功匹配和分配的输入项的数量;这个数字可以是 如果早期匹配失败,则为零。
因此,在这种情况下,检查fscanf(fi,"%d %d", &used,"a) == 2
是为了确保从文件中正确读取了used
和quota
。
这不等于EOF,它将如何理解该程序已经结束?
是的,尽管如此。再次,从手册页:
如果输入结束 在第一次转换(如果有)完成之前,并且没有 匹配失败,应返回EOF。
一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?
在格式字符串中放置空格(如此处"%d %d"
)时,fscanf
将跳过遇到的所有空格(包括空格,\n
和其他字符)。这意味着,如果您输入1 2
或1 2
或1\n2
,则所有三个输入都将被毫无问题地读取。
答案 1 :(得分:1)
一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?
这是关于scanf
家族的另一个有趣的事实。接到电话
fscanf(fi, "%d %d", &used, "a)
和输入行
10 20
它将成功读取used
的10和quota
的20,这可能是您要记住的。但是如果您给它输入
10
20
对于used
,它也很高兴能读到10;对于quota
,它会很高兴读成20。实际上,它对于输入也同样有效
10
20
,其中有一个空白行。此外,绝对没有办法(即调用fscanf
的代码的作者)确定输入是一行还是两行,或者是什么。
是否应该等于
EOF
,它将如何理解程序已经结束?
是真的:如果fscanf
在转换任何输入之前命中文件末尾,它将返回EOF
,这是您可能想知道的事情。但这不是您可能想知道的唯一错误条件。
假设输入行说
10 abc 20
在这种情况下,fscanf
调用将返回1,表示它能够读取used
的值10,但无法读取quota
的任何内容
检查2的原因(就像在您询问的代码中一样)是,只有fscanf
返回2时,它才读取并转换两个变量的值。