2017-01-28 4 views
2

Я пытаюсь прочитать файл и распечатать записи, в которых перемычка превысила расстояние, предоставленное пользователем, но поиск возвращает только первую строку в файле, и это все, Я знаю, что в логике есть что-то не так, но я не могу погладить ее.Поиск, возвращающий только первый результат в структуре C

#include<stdio.h> 
    #include<string.h> 

typedef struct { 
    char fname[30]; 
    char lname[30]; 
    char nationality [30]; 
    double distance; 
}Player; 

void print(Player p) { 
    printf("%s %s %s %f \n", p.fname, p.lname, p.nationality, p.distance); 
} 
int search(double distance, Player allPlayers[], int max){ 
    int i=0; 
    for(i=0; i<max; i++){ 
     if(distance > allPlayers[i].distance){ 
      return i; 
     } 
     return -1; 
    } 
} 

void load (char filename[10], Player players[]){ 

    char tempfName [30]; 
    char templName [30]; 
    char tempNationality [30]; 
    double tmpdistance; 
    FILE * input=fopen(filename,"r+"); 
    if(input==NULL) 
     printf("Error found in opening the file\n"); 
    else { 
     printf("The data are loaded successfully.\n"); 
     int counter = 0; 
     while(!feof(input)){ 

      strcpy(tempfName," "); 
      fscanf(input, "%s %s %s %f",tempfName, templName, tempNationality, &tmpdistance); 
      if(strcmp(tempfName, " ") !=0){ 
       strcpy(players[counter].fname, tempfName); 
       strcpy(players[counter].lname, templName); 
       strcpy(players[counter].nationality, tempNationality); 
       players[counter].distance = tmpdistance; 
       counter++; 
      } 
     } 
      fclose(input); 
    } 
} 
int main (int argc, char *argv[]){ 

    Player players2[40]; 
    char myFileName[10] ="jump.txt"; 

    load(myFileName, players2); 

    double tmpdistance; 
    printf("Please enter the distance threshold: "); 
    scanf("%lf", &tmpdistance); 
    printf("The jumpers exceeded 8.10 m are: \n"); 
    int index = -1; 
    index = search(tmpdistance,players2,40); 

    if(index!=-1) 
     print(players2[index]); 

    else 
     printf("NOT Found! \n"); 

    return 0; 
} 

некоторые выборочные данные из файла, который я пытаюсь прочитать:

Arsen Sargsyan Армения 7,62

Болеслав Схиртладзе Грузия 7,26

Кристиан Райф Германия 7,92

Кристофер Томлинсон Great_Britain 8.06

+1

'return -1;' перейти к for-loop. – BLUEPIXY

+1

Используйте '% lf' вместо'% f' 'fscanf' для' double' – BLUEPIXY

ответ

1

В вашей search() функции:

if(distance > allPlayers[i].distance){ 
    return i; 
} 

Это возвратит первую перемычку, исполнение которого меньше расстояние при условии.

Если вы замените его:

if(allPlayers[i].distance > distance){ 
    return i; 
} 

Это возвратит первую перемычку, исполнение которого больше, чем расстояние при условии, что то, что вы хотите.

также:

  1. Не перебирает feof() для чтения файла: Why is “while (!feof (file))” always wrong?
  2. Вы печать «Данные успешно загружены», когда вы еще не загрузили данные еще - вы» ве только что открыл файл
  3. Вам не нужны аргументы main()
  4. Вам не нужно инициализировать index к -1, как вы назначаете его в следующей строке
  5. Вам не нужно указывать размер myFileName, так как компилятор может его обработать
+0

Спасибо, очень полезно. – blahblah

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