gpt4 book ai didi

c - fscanf 函数如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:00 25 4
gpt4 key购买 nike

谁能告诉我 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com