- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
谁能告诉我 fscanf
在这个特定示例中是如何工作的(也是 EOF 所代表的)。代码有效,但我不明白其背后的过程。
#include <stdio.h>
#include <stdlib.h>
#define LEN 20
int main()
{ FILE *in;
float average;
char name[LEN];
char surname[LEN];
int grade, n_grades; //n_grades is the total number of grades a person has//
in = fopen("grades.txt","r");
if(in == NULL){
fprintf(stderr,"error fopen(): Failed to open file grades.txt.\n");
exit(EXIT_FAILURE);
}
while(fscanf(in,"%s",name) != EOF){
fscanf(in,"%s",surname);
n_grades = 0;
average = 0.0;
while( !feof(in) && fscanf(in,"%d",&grade)>0 ){
n_grades++;
average += grade;
}
if(n_grades >0)
average /= n_grades;
printf("%s %s %.2f\n", name, surname, average);
}
fclose(in);
return 0;
}
grades.txt
如下所示:
Steve Stevenson 2 9 4 3 2
John Johnson 2 11 5 3
Jack Jacskon 22 1 4 5
我不明白这个 while
循环是如何工作的。 fscanf
是如何准确知道何时读取哪个字符串的?它如何知道一行结束的时间以及如何继续下一行?
最佳答案
你必须专注于那里的双循环:
while(fscanf(in,"%s",name) != EOF){
fscanf(in,"%s",surname);
while( !feof(in) && fscanf(in,"%d",&grade)>0 ){
n_grades++;
}
}
EOF 代表 End Of File,因此第一个循环将继续直到找到文件末尾,即直到文件指针到达文件末尾。
现在记住你的文件有这样的数据:Steve Stevenson 2 9 4 3 2
。
因此第一个 while 将尝试读取一个名称,如果尚未达到 EOF,则意味着您读取了一个名称并将其分配到 name
中。在这里你读史蒂夫。
现在 fscanf(in,"%s",surname);
将从 in
指向的文件中的当前行读取第二个字符串(注意 %s
,表示我们希望读取的是一个字符串)。你读了 Stevenson 并将其分配给 surname
。
然后,在第二个 while 中,你一直读到不到达 EOF AND 直到你读到整数。如果你检查 fscanf() 的引用你会看到:
Return Value On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.
If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned.
因此,例如,当您读取换行符时,您将读取零整数,因此您将退出循环。
这样您最终将解析所有文件。
关于精神的例子我有here使用 scanf()
,您可以这样重写代码:
while(fscanf(in,"%19s",name) != EOF) {
为了避免溢出。这里 20 是数组的大小。
关于c - fscanf 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266210/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!