无尽的循环和fscanf没有为struct分配数据

时间:2015-11-26 09:57:24

标签: c file struct while-loop scanf

作为一项学校作业,我的任务是阅读足球比赛列表,其语法如下

weekday date time hometeam - outteam hometeam goals - outteam goals #spectators 这个例子可以是

FRI 18/07 18.30 FCN - FCV 3 - 2 3.349

这将使以下条目进入我的结构

struct match_data
{
    char match_day[4];
    int match_date_day;
    int match_date_month;
    char match_time[6];
    char match_home_team[4];
    char match_away_team[4];
    int match_home_goals;
    int match_away_goals;
    int match_spectators;
};

match_day:FRI

match_date_day:18

match_date_month:07

match_time:18.30

match_home_team:FCN

match_away_team:FCV

match_home_goals:3

match_away_goals:2

match_spectators:3.349

因此,当我尝试阅读文件时会出现问题

我的while循环似乎永远存在,当我按原样运行代码时(使用printf来测试已分配的数据)

int game_loader()
{
    int i = 0;
    FILE *file_pointer;

    file_pointer = fopen("superliga-2014-2015", "r");

    if(!file_pointer == NULL)
    {
        printf("Error opening file");
        return -1;
    }

    struct match_data match[200];
    while(!feof(file_pointer))
    {
        fscanf(file_pointer, "%[^ ][^0-9]%d/%d %[^ ][^A-Z]%[^ ] - %[^ ][^0-9]%d - %d[^ ]%d[^\n]\n",
        match[i].match_day,         &match[i].match_date_day,   &match[i].match_date_month,
        match[i].match_time,        match[i].match_home_team,   match[i].match_away_team, &match[i].match_home_goals,   &match[i].match_away_goals, &match[i].match_spectators);

        printf("day %d: %s\n", i, match[i].match_day);
        i++;
    }

    printf("match day is: %s\n"
        "match date is: %d/%d"
        "match time is: %s"
        "match is between %s - %s"
        "Score was: %d - %d"
        "the amount of spectators was: %d",
        match[1].match_day,         match[1].match_date_day,    match[1].match_date_month,
        match[1].match_time,        match[1].match_home_team,   match[1].match_away_team,
        match[1].match_home_goals,  match[1].match_away_goals,       match[1].match_spectators);

    return 0;
}

不仅循环永远不会关闭,而且fscanf永远不会将数据分配给变量

我认为这是因为当我尝试从match_day移动到match_date_day时我错误地格式化了fscanf我尝试使用[^ 0-9]来跳过当天和日期之间的空格< / p>

1 个答案:

答案 0 :(得分:1)

您应该检查您可能发生故障的功能。 尤其作为{em>倾向作为*scanf()失败。这是你应该进入的习惯。

您可能正在查看匹配失败,即输入与您的格式字符串不匹配,这会使*scanf()提前返回而不会提升文件中的位置

所以你只是不断尝试(并且失败)一遍又一遍地读取相同的数据。

此外,如果*scanf()失败,*printf()的{​​{1}}可能会调用未定义的行为(打印未初始化的值)。 ; - )

至于为什么为什么你的match_day失败了...我很确定你不能 多个 {{1}在一个转换说明符中。