在此行fscanf(fi,“%d%d”,&used,quota)== 2等于2意味着什么?

时间:2019-09-21 18:04:39

标签: c file pointers

我开始学习文件,但我并不完全了解它们的读取方式。

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

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

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

  2. 一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?

2 个答案:

答案 0 :(得分:1)

看看the manual page for fscanf

  

返回值

     

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

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


  

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

是的,尽管如此。再次,从手册页:

  

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


  

一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?

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

答案 1 :(得分:1)

  

一行包含数据的文件与一行包含数据的文件有何不同?它如何显示\ n,例如,我如何仅读取第一行或第二行?

这是关于scanf家族的另一个有趣的事实。接到电话

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

和输入行

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时,它才读取并转换两个变量的值。