2015-11-26 1 views
-1

Как им назначениях школы поставлена ​​задача, чтобы прочитать список футбольных матчей, со следующим синтаксисомБесконечное время цикла и fscanf не назначая данные на структуру

weekday date time hometeam - outteam hometeam goals - outteam goals #spectators пример Thsi может быть

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; 
}; 

матч _day: ПТ

match_date_day: 18

match_date_month: 07

match_time: 18.30

match_home_team: СКЛС

match_away_team: АХЛИ

match_home_goals: 3

match_away_goals : 2

match_spectators: 3,349

Так что проблемы accour когда я пытаюсь прочитать файл

мой в то время как цикл, кажется продолжаться вечно, когда я запускаю код как есть (с Printf, чтобы проверить Wether данные были присвоены)

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 никогда не присваивает данные переменным

им думать, что это потому, что я форматировать fscanf неправомерно, когда я пытаюсь перейти от match_day к match_date_day я попытался с помощью [^ 0-9], чтобы пропустить пробелы между днем ​​и датой

+1

Что такое возвращаемое значение 'fscanf()'? * И почему ваш код не проверяет это? * – DevSolar

+0

fscanf возвращает количество элементов, успешно совпадающих и назначенных, я еще не успел вскочить на проверку fscanf, добавив еще один набор паратезмов вокруг него, чтобы добавить 'if! = 9' быть правильным? так что строка будет 'if (fscanf (file_pointer, синтаксис для форматированного txt)! = 9)' –

+0

Ум, глаза кошки? я предполагаю, что вы имеете в виду либо обозначение, либо белое/пустое пространство, что бы вы подразумевали под этим? :-) –

ответ

1

Вы должны проверить функции вы называете для потенциального отказа. Особенно функционирует как подвержен к ошибке как *scanf(). Это привычка должна войти.

Вы, вероятно, глядя на провал матча, то есть вход, не соответствующая строка формата, что делает *scanf() возвращение рано без продвижения позиции в файле.

Таким образом, вы просто пытаетесь (и не можете) читать одни и те же данные снова и снова.

Кроме того, если *scanf() не удалось, *printf() из match_day может вызывать неопределенное поведение (печать неинициализированных значений). ;-)


Что касается почему именно вашего *scanf() не удается ...Я совершенно уверен, что вы не может есть несколько[...] в один спецификация преобразования.

+0

Как было отмечено выше, я пытаюсь реализовать' if (/ * my scan funktion * /! = 9) 'чтобы проверить, было ли scanf успешным, этого было бы достаточно? –

+0

Просто понял, что: -p –

+0

@Dream_Reaper: Вообще говоря, если есть * любой * шанс, что ваш ввод может быть не таким, как ожидалось, - как в основном * всегда *, если ваше программное обеспечение не написало этот файл данных сам и, возможно, даже тогда - советуем использовать 'fgets()' для чтения целой строки в памяти, а затем проанализировать строку в памяти, используя, например, 'strtol()', 'strtod()' и т. д. '* scanf()' изменчивый зверь. – DevSolar

Смежные вопросы