Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅返回结构C中的第一个结果的搜索_C_Search_Sequential - Fatal编程技术网

仅返回结构C中的第一个结果的搜索

仅返回结构C中的第一个结果的搜索,c,search,sequential,C,Search,Sequential,我正在尝试读取一个文件并打印跳线超过用户提供的距离的记录,但搜索只返回文件中的第一行,就是这样,我知道逻辑中有错误,但我无法指出 #include<stdio.h> #include<string.h> typedef struct { char fname[30]; char lname[30]; char nationality [30]; double distance; }Player; void print(P

我正在尝试读取一个文件并打印跳线超过用户提供的距离的记录,但搜索只返回文件中的第一行,就是这样,我知道逻辑中有错误,但我无法指出

    #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;
}
#包括
#包括
类型定义结构{
char-fname[30];
字符名称[30];
查尔族[30];
双倍距离;
}玩家;
无效打印(玩家p){
printf(“%s%s%s%f\n”,p.fname,p.lname,p.national,p.distance);
}
整数搜索(双倍距离,玩家所有玩家[],整数最大值){
int i=0;
对于(i=0;i所有玩家[i]。距离){
返回i;
}
返回-1;
}
}
无效加载(字符文件名[10],玩家[]){
char tempfName[30];
字符模板名称[30];
国籍[30];
双TMP距离;
FILE*input=fopen(文件名为“r+”);
如果(输入==NULL)
printf(“打开文件时发现错误”);
否则{
printf(“数据加载成功。\n”);
int计数器=0;
而(!feof(输入)){
strcpy(tempfName,“”);
fscanf(输入,“%s%s%s%f”、tempfName、tempname、tempNationality和tmpdistance);
如果(strcmp(tempfName,“”)=0){
strcpy(玩家[计数器].fname,tempfName);
strcpy(玩家[计数器].lname,模板名);
strcpy(球员[柜台]。国籍,临时国籍);
玩家[计数器]。距离=TMP距离;
计数器++;
}
}
fclose(输入);
}
}
int main(int argc,char*argv[]){
玩家2[40];
char myFileName[10]=“jump.txt”;
加载(myFileName,players2);
双TMP距离;
printf(“请输入距离阈值:”);
扫描频率(“%lf”、&tmpdistance);
printf(“超过8.10米的跳线为:\n”);
int指数=-1;
索引=搜索(tmpdistance,players2,40);
如果(索引!=-1)
打印(players2[索引]);
其他的
printf(“未找到!\n”);
返回0;
}
我试图读取的文件中的一些示例数据:

亚美尼亚阿森萨尔基西亚7.62

佐治亚州博列斯拉夫斯基特拉泽7.26

克里斯蒂安·雷夫德国7.92

Christopher Tomlinson Great_Britain 8.06在
搜索()功能中:

if(distance > allPlayers[i].distance){
    return i;
}
这将返回性能小于所提供距离的第一个跳线

如果将其替换为:

if(allPlayers[i].distance > distance){
    return i;
}
它将返回性能大于所提供距离的第一个跳线,这是您想要的

此外:

  • 不要循环使用
    feof()
    读取文件:
  • 您正在打印“数据已成功加载”,而您尚未加载数据-您刚刚打开了文件
  • main()
  • 在下一行分配时,不需要将
    索引初始化为-1
  • 您不需要指定
    myFileName
    的大小,因为编译器可以计算出来

  • return-1移动到for-loop后。使用
    %lf
    而不是
    fscanf
    %f
    进行
    double
    非常感谢,非常有用。