C语言学生信息管理系统实现查询学生信息时出现问题

用程序运行search()函数查询学生信息时,文件中有学生信息,但是每次输入学号或姓名后都显示“查无此人”。这个该怎么办呢?
search()函数代码如下:

void search()   //该函数用于查询学生信息
{
    int searchmode; //子菜单选择
    int i,j = 0,findid;
    char findname[10];
    int findok;  //定义一个判断标志的整型变量findok
    char findct; //定义一个用于判断是否继续查找的字符变量findct
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "r"); //以"只读"方式打开students文本文件
    /*查询菜单*/
    printf("\t\t成绩查询");
    printf("\n\t1按姓名查询");
    printf("\n\t2按学号查询");
    printf("\n\t0返回上级菜单");
    printf("\n请输入您的操作:");
    scanf("%d", &searchmode);
    /*查询操作*/
    switch (searchmode)
    {
    case 1:
        {
            printf("请输入要查询学生的姓名:\n");
            getchar();
            scanf("%s", findname);
            for (i = 0; i < n; i++)
            {
                fread( & st[i], sizeof(struct Student), 1, fp); //读入students文本文件
                if (strcmp(st[i].name, findname) == 0) //比较字符串
                {
                    j++;
                    printf("\n查寻到的学生为:\n");
                    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                    printf(" %d ", st[i].id);
                    printf("    %-s ", st[i].name);
                    printf("     %-s ", st[i].gender);
                    printf("     %d ", st[i].age);
                    printf("\t%d ", st[i].MathAna);
                    printf("\t\t%d ", st[i].LiAlg);
                    printf("\t\t%d ", st[i].Computer);
                    printf("\t\t%d ", st[i].English);
                    printf("\t\t%.2f \n", st[i].GPA);
                }
            }
            if (j == 0)
            printf("\n>>>查无此人!");
            //提示是否继续 
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
            search();
        }
        break;
    case 2:
        {
            printf("请输入要查询学生的学号:");
            scanf("%d", &findid);
            for (i = 0; i < n; i++)
            {
                fread( & st[i], sizeof(struct Student), 1, fp); //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个学生的信息
                if (st[i].id == findid) //整型数字的比较
                {
                    findok = 1;
                    break;
                }
                else findok = 0;
            }
            if (!findok)
            printf("\n>>>查无此人!");
            else
            {
                printf("\n查寻到的学生为:\n");
                printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                printf(" %d ", st[i].id);
                printf("    %-s ", st[i].name);
                printf("     %-s ", st[i].gender);
                printf("     %d ", st[i].age);
                printf("\t%d ", st[i].MathAna);
                printf("\t\t%d ", st[i].LiAlg);
                printf("\t\t%d ", st[i].Computer);
                printf("\t\t%d ", st[i].English);
                printf("\t\t%.2f \n", st[i].GPA);
            }
            //提示是否继续
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
            search();
        }
        break;
    }
    fclose(fp); //关闭文件
}

修改如下,供参考:

void search()   //该函数用于查询学生信息
{
    struct Student stmp;//修改

    int searchmode; //子菜单选择
    int i,j = 0,findid;
    char findname[10];
    int  findok;  //定义一个判断标志的整型变量findok
    char findct; //定义一个用于判断是否继续查找的字符变量findct
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "r"); //"只读"方式打开students文本文件
    /*查询菜单*/
    printf("\t\t成绩查询");
    printf("\n\t1按姓名查询");
    printf("\n\t2按学号查询");
    printf("\n\t0返回上级菜单");
    printf("\n请输入您的操作:");
    scanf("%d", &searchmode);
    /*查询操作*/
    switch (searchmode)
    {
    case 1:
        {
            j = 0;  //修改
            printf("请输入要查询学生的姓名:\n");
            getchar();
            scanf("%s", findname);
            while (1) //for (i = 0; i < n; i++)  修改
            {   //读入students文本文件
                if (fread(&stmp, sizeof(struct Student), 1, fp) != 1) break; //修改
                if (strcmp(stmp.name, findname) == 0) //比较字符串
                {
                    j++;
                    printf("\n查寻到的学生为:\n");
                    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                    printf(" %d ", stmp.id);          //修改
                    printf("    %-s ", stmp.name);    //修改
                    printf("     %-s ", stmp.gender); //修改
                    printf("     %d ", stmp.age);     //修改
                    printf("\t%d ",   stmp.MathAna);  //修改
                    printf("\t\t%d ", stmp.LiAlg);    //修改
                    printf("\t\t%d ", stmp.Computer); //修改
                    printf("\t\t%d ", stmp.English);  //修改
                    printf("\t\t%.2f \n", stmp.GPA);  //修改
                }
            }
            if (j == 0)
                printf("\n>>>查无此人!");
            //提示是否继续
            fclose(fp); //     修改
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
                search();
        }
        break;
    case 2:
        {
            findok = 0;    //修改
            printf("请输入要查询学生的学号:");
            scanf("%d", &findid);
             while (1)  //for (i = 0; i < n; i++)   //修改
            {   //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个学生的信息
                if (fread(&stmp, sizeof(struct Student), 1, fp) != 1) break; //修改
                if (stmp.id == findid) //整型数字的比较
                {
                    findok = 1;
                    printf("\n查寻到的学生为:\n");
                    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
                    printf(" %d ", stmp.id);         //修改
                    printf("    %-s ", stmp.name);   //修改
                    printf("     %-s ",stmp.gender); //修改
                    printf("     %d ", stmp.age);    //修改
                    printf("\t%d ", stmp.MathAna);   //修改
                    printf("\t\t%d ", stmp.LiAlg);   //修改
                    printf("\t\t%d ", stmp.Computer);//修改
                    printf("\t\t%d ", stmp.English); //修改
                    printf("\t\t%.2f \n",stmp.GPA);  //修改
                }
                //else findok = 0;  修改
            }
            if (!findok)
                printf("\n>>>查无此人!");
            //else                            //修改
            //{                               //修改
            //    printf("\n查寻到的学生为:\n");
            //    printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
            //    printf(" %d ", st[i].id);
            //    printf("    %-s ", st[i].name);
            //    printf("     %-s ", st[i].gender);
            //    printf("     %d ", st[i].age);
            //    printf("\t%d ", st[i].MathAna);
            //    printf("\t\t%d ", st[i].LiAlg);
            //    printf("\t\t%d ", st[i].Computer);
            //    printf("\t\t%d ", st[i].English);
            //    printf("\t\t%.2f \n", st[i].GPA);
            //}
            //提示是否继续
            fclose(fp); //     修改
            printf("\n是否继续查找(Y/N)?");
            getchar();
            findct = getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量findct,用于以下的if语句的判断
            if (findct == 'Y' || findct == 'y')
                search();
        }
        break;
    }
}

首先,在你从文件中读取学生信息时,你应该使用循环读取,而不是使用 for 循环。例如:

struct Student st;
while (fread( & st, sizeof(struct Student), 1, fp) == 1)
{
// 这里是读取一条记录的代码
}

其次,在查询学生信息时,你应该使用 fread() 读取记录,而不是使用 st 数组。例如:

struct Student st;
while (fread( & st, sizeof(struct Student), 1, fp) == 1)
{
if (strcmp(st.name, findname) == 0)
{
// 这里是找到了匹配的记录
}
}