2016-04-06 2 views
0
struct athlete{ 
    char firstName[50]; 
    char lastName[70]; 
    int age, total, bronze, gold, silver, year; 
    char country[70]; 
    char sport[100]; 
}; 

У меня есть структура, в которой хранятся олимпийские спортсмены, имена медалей страны и т. Д. Из файла с датой. AJ Млечко 26 США 2002 Хоккей 0 1 0 1Содержимое файла не читается в строении

Aaron Armstrong 30 Trinidad and Tobago 2008 Athletics 0 1 0 1 
Aaron Egbele 25 Nigeria 2004 Athletics 0 0 1 1 
Aaron Gate 21 New Zealand 2012 Cycling 0 0 1 1 

так, что я делал, было это:

void readFile(){ 
    FILE *fptr; 
    int i; 
    fptr = fopen("olympics.txt", "r"); 
    if (fptr == NULL) 
    { 
     printf ("Error"); 
    } 
    i = 0; 
    while (!feof(fptr)) 
    { 
     fscanf(fptr,"%s %s %d %s %d %s %d %d %d %d ", athletes[i].firstName,athletes[i].lastName, &athletes[i].age, athletes[i].country, &athletes[i].year, athletes[i].sport, &athletes[i].gold, &athletes[i].silver, &athletes[i].bronze, &athletes[i].total); 
     i++; 
    } 
} 

Everytime я бегу это программа просто crashes.I'm пытается запустить простой поиск также, что может быть проблемой.

void compareString(char first[], char second[]) { 
    int i = 0; 
    struct athlete athletes[2000]; 
    for(i = 0; i < 2000; i++) 
    { 
     if(strcmp(athletes[i].firstName, first) == 0 && strcmp(athletes[i].lastName, second) == 0) 
     { 
      printf("%s%s", athletes[i].firstName, athletes[i].lastName); 
     } 
     else 
     { 
      printf("error"); 
     } 
    } 
} 
+2

'New Zealand', среди других, ни одна строка. Из-за этого ваши спецификаторы формата выходят из строя. – Unimportant

+0

О, я вижу это, спасибо: D – conk

+0

Отступы свой код. –

ответ

0

"Trinidad and Tobago" и "New Zealand" содержат пробелы, что предотвращает %s из сканирования их правильно. Кроме того, не рекомендуется использовать while(!feof(fptr)).

Вы можете использовать следующий цикл для ввода данных:

while (fscanf(fptr," %s %s %d %[^0-9] %d %[^0-9] %d %d %d %d", athletes[i].firstName, athletes[i].lastName, &athletes[i].age, athletes[i].country, &athletes[i].year, athletes[i].sport, &athletes[i].gold, &athletes[i].silver, &athletes[i].bronze, &athletes[i].total) == 10) 
{ 
    i++; 
} 
+0

Спасибо. Что делает [^ 0-9]? – conk

+0

@ C.Red Это соответствует всем символам, отличным от '0', '1', '2', ..., '9' –