1、源代码知识讲解#include#include#includetypedef struct pnode /结构体定义 用于存放学生信息的节点 char name 8; /姓名 char xh16; /学号 char fh30; /房号 personnode;char filename50; /文件名FILE *fp; /指向文件的指针void creat() /创建新数据文件的函数 创建一个二进制文件 用于存放学生数据 personnode *person; person=(personnode *)malloc(sizeof(personnode); /为节点分配内存 printf(n 请输
2、入文件名:n); scanf(%s,filename); if(fp=fopen(filename,w+)=NULL) printf(n 你没有输入文件名,不能找到文件夹); exit(0); printf(n 请输入姓名,学号(相同的长度)和房号,以空格隔开,以#结束n); scanf(%s,person-name); while(strcmp(person-name,#) /该循环用于控制学生信息的录入 当输入#时 学生信息录入完毕 scanf(%s %s,person-xh,person-fh); fprintf(fp,%-10s%-20s%-50sn,person-name,perso
3、n-xh,person-fh); scanf(%s,person-name); fclose(fp);void readfile() /文件读取函数 用于打开已有的二进制数据文件printf(n please enter the fileroad:n); scanf(%s,filename); /此处输入为文件的路径 如c:zhang if(fp=fopen(filename,r+)=NULL) printf(n cant open thefile:n); exit(0); fclose(fp);void output() /输出函数 用于输出文件的全部信息 personnode *perso
4、n; long offset1,offset2; char name18,name28,name38; char xh116,xh216,xh316; char fh130,fh230,fh330; person=(personnode *)malloc(sizeof(personnode); if(fp=fopen(filename,r)=NULL) printf(n cant open the file); exit(0); while(!feof(fp) /此循环用于对文件数据中关键字学号进行从小到大冒泡排序 int a,b,c,d; /a为循环结束判定变量 b,c,d用于起泡排序时学号
5、交换的替换 if(fp=fopen(filename,r+)=NULL) printf(n cant open the file); exit(0); while(!feof(fp) / 从文件头开始遍历 while(!feof(fp) /对两组数据进行排序 offset1=ftell(fp); /获取文件内部当前指针位置 fscanf(fp,%s%s%sn,person-name,person-xh,person-fh); strcpy(name1,person-name); strcpy (xh1,person-xh); strcpy(fh1,person-fh); if(feof(fp)
6、 break; /文件结束 跳出循环 offset2=ftell(fp); /获取文件内部下一指针位置 fscanf(fp,%s%s%sn,person-name,person-xh,person-fh); strcpy (name2,person-name); strcpy(xh2,person-xh); strcpy(fh2,person-fh); b=strlen(xh1); c=strlen(xh2); d=strcmp(xh1,xh2); if(b=c&d0) /如果 学号1大于等于学号2 则交换全部数据 strcpy(name3,name1); strcpy(name1,name2
7、); strcpy(name2,name3); strcpy(xh3,xh1); strcpy(xh1,xh2); strcpy(xh2,xh3); strcpy(fh3,fh1); strcpy(fh1,fh2); strcpy(fh2,fh3); fseek(fp,offset1,SEEK_SET); /将文件指针移动offset1个字节 strcpy(person-name,name1); strcpy(person-xh,xh1); strcpy(person-fh,fh1); fprintf(fp,%-10s%-20s%-50sn,person-name,person-xh,pers
8、on-fh);/排序后写入文件 strcpy(person-name,name2); strcpy(person-xh,xh2); strcpy( person-fh,fh2); fprintf(fp,%-10s%-20s%-50sn,person-name,person-xh,person-fh);/排序后写入文件 /if fseek(fp,offset2,SEEK_SET); /将文件位置指针从文件头向前移动offset2个字节 /while对两组数据进行排序 rewind(fp); /指向头文件 while(!feof(fp) /此循环用于判断学号是否有序 offset1=ftell(f
9、p); fscanf(fp,%s%s%sn,person-name,person-xh,person-fh); strcpy(xh1,person-xh); if(feof(fp) a=1; break; offset2=ftell(fp); fscanf(fp,%s%s%sn,person-name,person-xh,person-fh); strcpy(xh2,person-xh); b=strlen(xh1); c=strlen(xh2); d=strcmp(xh1,xh2); if(b=c&dname,person-xh,person-fh); printf(%-10s%-20s%-
10、50sn,person-name,person-xh,person-fh); fclose(fp); printf(*nn);void search1() / 按姓名搜索函数 int k=0; char namekey8; personnode *person; person=(personnode *)malloc(sizeof(personnode); printf(n please enter the namehead you need :); scanf(%s,namekey); if(fp=fopen(filename,rb)=NULL) printf(n cant open the
11、file); exit(0); while(!feof(fp) fscanf(fp,%s %s %sn,person-name,person-xh,person-fh); if(!strcmp(namekey,person-name) /比较是否相同 相同则输出结果 否则输出未找到记录 printf(nn have serched,the courrent is:); printf(%-10s%-20s%-50sn,person-name,person-xh,person-fh); k=1; if(!k) printf(nn sorry,there is not the current of
12、thiss people n); fclose(fp);void search2() /按学号搜索函数 int k=0; char xhkey16; personnode *person; person=(personnode *)malloc(sizeof(personnode); printf(n please enter the roomnumber you want to serch:); scanf(%s,xhkey); if(fp=fopen(filename,rb)=NULL) printf(n cant open the file ); exit(0); while(!feof
13、(fp) fscanf(fp,%s %s %sn,person-name,person-xh,person-fh); if(!strcmp(xhkey,person-xh) /比较是否相同 相同则输出结果 否则输出未找到记录 printf(nn have got it,the current is:); printf(%-10s%-20s%-50sn,person-name,person-xh,person-fh); k=1; if(!k) printf(nn sorry,there is not the current of thiss people n); fclose(fp);void
14、search3() /按房号搜索函数 int k=0; char fhkey30; personnode *person; person=(personnode *)malloc(sizeof(personnode); printf(n please enter the roomnumber you want to serch:); scanf(%s,fhkey); if(fp=fopen(filename,rb)=NULL) printf(n cant open thefile); exit(0); while(!feof(fp) fscanf(fp,%s %s %sn,person-nam
15、e,person-xh,person-fh); if(!strcmp(fhkey,person-fh) /比较是否相同 相同则输出结果 否则输出未找到记录 printf(nn have got it,the current is:); printf(%-10s%-20s%-50sn,person-name,person-xh,person-fh); k=1; if(!k) printf(nn sorry,there is not the current of thiss peoplen); fclose(fp);void main() /主函数 int m,flag=1; / m用于控制菜单的
16、选择项 flag用于控制菜单弹出 while(flag) printf(%33sn,thefile); printf(*n); printf(tt0-创建一个新的学生数据文件n); printf(tt1-读取一个已经建立的文件n); printf(tt2- 按名字进行查询n); printf(tt3- 按学号进行查询n); printf(tt4- 按宿舍号进行查询n); printf(tt5-输出按学号进行排序的文件n); printf(tt6-退出n); printf(*n); printf(t 请选择(0-6)n); scanf(%d,&m); switch(m) case 0:creat(); break; case 1:readfile(); break; case 2:search1(); break; case 3:search2(); break; case 4:search3(); break; case 5:output(); break; case 6:exit(0); break;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2