/*学生查询功能按学号查找*/
void serch()
{
STUDENT stu[3];
FILE *fp;
int i, j=0;
char ID[5];
printf("input your ID:");
scanf("%s",ID[j]);
if((fp=fopen("D:\\student.txt","r"))==NULL)
{
printf("Failure to open student.txt!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(stu[i].ID==ID[j])
{
fread(&stu[i],sizeof(STUDENT),1,fp);
printf("%s%s% c%d%d",stu[i].ID,stu[i].name,stu[i].sex,stu[i].Escore,stu[i].Cscore);
}
}
fclose(fp);
}
1. 前面if((fp=fopen("D:\\student.txt","r"))==NULL) 这个不是已经以只读方式打开文件么 ?所以我就先写fread了,是想如果比较的学号一样就只读该学号学生的所有信息再打出来 ,我是这么理解的,不知道对不对
2.stu[i].ID是字符串类型
3.话说我调完顺序还是不对。还有“stu只是个临时变量而已,在循环里stu[0]用过一次之后就没有用了”这句我没懂,什么stu[0] ?
ps:真的非常感谢你的回答!!
1. fopen只是打开你想操作的文件,这个过程只获得一个文件描述符:fp,这样你就可以认为fp就是“student.txt” ,然后才可以用fread去读
也就是吃饭的过程,stu[i]就是那个碗,fp就是电饭锅,fopen是打开电饭锅的盖子(这时候你的碗里什么都没有),fread是用勺子把饭盛到碗里
你可以去看看fread的解释,百科就可以,他的意思是从fp中读取sizeof(STUDENT)大小的数据,单位大小是1字节,并把数据存入&stu[i] 所指向的内存中,只有经历这个过程,你的stu里面才会有数据,知识fopen是不行的。
2. 如果stu[i].ID是字符串类型,那么比较字符串的时候应该用strcmp,而不能用 == 来进行比较,这里建议你用int型比较好
3. 你理解了fopen和fread的意义就应该能解释这个问题了,fopen只是打开文件,fread才是读取内容到stu中
你是不是认为fopen之后stu里面就存着3个学生的数据了?不是的,而是每个fread之后会像stu[i]中存入一个学生的数据,每个循环取一个,循环3次就是3个人
如果依然遇到错误可以把具体错误贴出来,不要说得那么笼统,那样解决不了问题,信息量太大的话你可以百度hi我
谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事
追答查查 字符串长度是否足够
N到底有多大
if(stu[i].ID==ID[j]) 这种比较也是错的 应该用strcmp 函数
谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事
追答if(stu[i].ID==ID[j])
这里是不对的。
还有 你的数据文件时什么情况?这个for循环能正常结束吗??
我是想建个字符数组保存输入的学号 在从文件里读取学号信息 然后在for循环里挨个比较 一样的就输出学生的所有信息 (那个我改成这样if(strcmp(stu[i].ID,ID[j])==0) 还是不对)TAT
追答你输入的是ID,为什么拿ID[j]这个单个字符去比较呢??
追问那啥 我把j初始化为0 以为ID[j]里存的就是输入的学号了
谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事
追答for 循环有问题,你这样写的目的是什么, 比较字符串相等应该用strcmp
追问我是想建个字符数组保存输入的学号 在从文件里读取学号信息 然后在for循环里挨个比较 一样的就输出学生的所有信息 (那个我改成这样if(strcmp(stu[i].ID,ID[j])==0) 还是不对)TAT
追答你的意思是输入一个学号然后, 然后文件中一个完整学生的信息, 拿这个学号与学生的学号作比较,如果相等就输出这个学生的信息
还有你文件中的学生信息是如何存的, fread事一个学生信息到结构体中,字符串如学生ID是是否有0结尾,for中找到该学生信息后应该break退出
另外我给你一下我的思路吧,在正规的开发中,强调函数的功能单一性,只做它该做的事,也即所谓模块化, 你这查找功能 的函数应该这样定义才比较好 , 当然前期学习你可以那样做,但最好保持良好习惯
BOOL search(const char* stuID, FILE* fp, stu* out); //查找
void print(stu* pstu); //输出学生信息