扫描C中的文件

时间:2016-11-27 04:14:24

标签: c file loops scanning

所以我的文本文件中有以下内容:

7
PERSON Sarah 20 5 50
PERSON Jordan 30 10 30
PERSON James 25 42 56.50
GROUP STEEL 2
Martin 21 5 80.50
Martha 25 10 79.75
PERSON Hector 38 10 100.50
PERSON Charles 18 5 35
GROUP LUMBER 3
Jill 19 5 91
Aaron 25 10 98
Mark 28 42 152.80

所以我试图让我的代码循环遍历这里的所有名称并打印出信息。名称代表人名,第一个数字代表年龄,第二个数字代表公里运行,第三个数字代表筹集的金额。 PERSON代表个人,而团体代表多个人。第一行中的7表示人员和群组的总数;有5人标记为PERSON,2组标记为GROUP。

但是,我的代码只打印出每个人都有PERSON标签的信息。如何获取代码以打印组名称及其成员的信息?这是我的代码(不完全,但显示我正在尝试做的事):

FILE * ifp = fopen("race01.txt", "r");
int numPeople, i, num = 1;
struct person individual;

fscanf(ifp, "%d", &numPeople);

for(i = 0; i < numPeople; i++) {
        fscanf(ifp, "%s %s %d %d %f", individual.name, individual.name, &individual.age, &individual.event, &individual.money);

        if (individual.event == 42) {
            printf("%s registered for the marathon race! They have been assigned the number %d\n", individual.name, num);
        }
        else {
            printf("%s registered for the %dk race! They have been assigned the number %d\n", individual.name, individual.event, num);
        }

        num++;
    }

我尝试了各种各样的变化,从嵌套的for循环到另外的扫描线,但似乎没有任何东西覆盖“组”。

1 个答案:

答案 0 :(得分:1)

正如Jonathan所说,你应该检查你读的第一个字符串是&#34; PERSON&#34;或&#34; GROUP&#34;。如果它等于&#34; PERSON&#34;,您会阅读有关此人的信息(姓名,年龄等),如果等于&#34; GROUP&#34;,您应该阅读该组中的人数然后阅读有关该组中每个人的信息。使用&#34; strcmp&#34;等功能比较两个字符串。 我在下面有你的代码的修改版本,它编译和工作正常。 我创建了一个名为&#34; print_raceinfo&#34;的函数。它打印有关某人的信息

#include<stdio.h>
#include<math.h>

#define NAME_MAX 25

struct person {
   char name[NAME_MAX];
   int age;
   int event;
   float money;
};

void print_raceinfo(struct person individual, int num)
{
    if (individual.event == 42) {
        printf("%s registered for the marathon race! They have been assigned the number %d\n", individual.name, num);
    }
    else {
        printf("%s registered for the %dk race! They have been assigned the number %d\n", individual.name, individual.event, num);
    }
}

int main(){

    FILE *fp;
    int numPeople, i, num = 1;
    struct person individual;
    char person_or_group[NAME_MAX];
    char group_name[NAME_MAX];
    int numpeople_in_group, j;

    fp = fopen("F://repoexample/race.txt", "r+");
    fscanf(fp, "%d", &numPeople);

    for(i = 0; i < numPeople; i++) {

        fscanf(fp, "%s", person_or_group);

        //Compare the first 6 characters of string person_or_group with "PERSON"
        if (strncmp(person_or_group, "PERSON", 6) == 0) {

            fscanf(fp, "%s %d %d %f", individual.name, &individual.age, &individual.event, &individual.money);

            print_raceinfo(individual, num);

            num++;
        }
        else if (strncmp(person_or_group, "GROUP", 5) == 0){

                //Read group name and number of people in that group
                fscanf(fp, "%s %d", group_name, &numpeople_in_group);

                for (j = 0; j<numpeople_in_group; j++) {

                    //Extract information for each person in that group
                    fscanf(fp, "%s %d %d %f", individual.name, &individual.age, &individual.event, &individual.money);

                    print_raceinfo(individual, num);

                    num++;
                }
        }

   }

    printf("Total number of persons = %d\n", num - 1);

    return 0;
}

输出: SEE OUTPUT