用程序运行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)
{
// 这里是找到了匹配的记录
}
}