使用fscanf的while语句初学者编程混淆

时间:2014-12-16 19:44:08

标签: c file scanf

以下是我想要了解的程序。我唯一困惑的部分是while语句while fscanf(....) == 4以及if(...) == 0部分。

有人可以向我解释这一行及其目的吗?

#include <stdio.h>
#include <stdlib.h>


struct str_student {
    char UFID[9];
    char firstname[20];
    char major[10];
    int age;
};


 int main(int argc, char *argv[]) {
     FILE *fStud = fopen("students.dat", "r");
     struct str_student S[11];

    int i, n = 0;
    while( fscanf(fStud, "%s %s %s %i", S[n].UFID, S[n].firstname, S[n].major, &S[n].age) == 4)          
    {    if(( S[n].age > 40 ) && ( strcmp(S[n].major, "ECE") == 0 ))
            n = n + 1;
    }

    printf("\nStudents of the ECE Department who are 41 or more years old:\n");
    for( i=0; i<n; i++ ) {
         printf("%s\n", S[i].UFID);
    }

    return 0;
 }

2 个答案:

答案 0 :(得分:5)

fscanf返回已读取的字段数。格式字符串"%s %s %s %i"有四个字段,因此只要while (fscan(...) == 4)能够读取所有四个字段,fscanf就会循环。如果它到达文件结尾(EOF),或者文件包含格式不正确的数据(例如%i字段不是有效整数),它将退出。

如果两个字符串匹配,则

strcmp返回0。 if (strcmp(a, b) == 0)是检查C中两个字符串是否相等的最常用方法。

答案 1 :(得分:0)

解释

if(( S[n].age > 40 ) && ( strcmp(S[n].major, "ECE") == 0 ))
    n = n + 1;

表达式的两个部分

if (condition1 && condition2)

必须是真的。

如果age > 40,第一部分显然是正确的。

如果比较的两个字符串相同,则第二部分为真strcmp(...) == 0

fscanf()的结果已存储在数组索引[n]中,但仅当条件为真时,索引才会递增。否则,结果将被下一条数据线覆盖(如果没有其他数据线,则被丢弃)。