这个程序的读取功能有点问题,自己找不出来了,麻烦大家看看
这个程序,从B.TXT读取数据的时候有点问题,读取的数据不正确,哪个大虾帮忙看看:程序代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct class_//成绩结构体 { char no2[10]; char no1[5]; char name1[10]; float score_; float score[3]; float all; float aver; int paiming; struct class_*next1; }pp; typedef struct student//学生基本信息 { char no[10]; char name[20]; char sex[5]; char num[5]; char tel[15]; struct student *next; }STU; /*******************************************************************************************************************************/ STU*xinxia()//A.txt信息的录入 { FILE *fp; STU *p1,*h=NULL,*p2; p1=(STU*)malloc(sizeof(STU)); h=p1; fp=fopen("A.txt","r"); if(!fp) { printf("文件打开失败!\n"); exit(1); } if(!feof(fp))//从文件中读数据直到文件尾 { //头结点 赋值 if(!fscanf(fp,"%s %s %s %s %s",p1->no,p1->name,p1->sex,p1->num,p1->tel)) { printf("文件读取不成功\n"); exit(1); } printf("%s %s %s %s %s\n",p1->no,p1->name,p1->sex,p1->num,p1->tel); while(!feof(fp)) { p2=(STU*)malloc(sizeof(STU)); //新结点 if(!fscanf(fp,"%s %s %s %s %s",p2->no,p2->name,p2->sex,p2->num,p2->tel)) { printf("文件读取不成功\n"); exit(1); } printf("%s %s %s %s %s\n",p2->no,p2->name,p2->sex,p2->num,p2->tel); p2->next=NULL; p1->next=p2; p1=p2; } fclose(fp); } return h; // p1=h; /* while(p1!=NULL)//这里,对所输出的数据进行测试! { printf("%s %s %s %s %s\n",p1->no,p1->name,p1->sex,p1->num,p1->tel); p1=p1->next; }*/ } /********************************************************************************/ pp*xinxib()//B.txt信息录入 { FILE *fp2; pp *q1,*q2=NULL,*h1=NULL;//pp为科目结构体的类型 fp2=fopen("B.txt","r"); if(!fp2) { printf("文件打开失败"); exit(1); } q1=(pp*)malloc(sizeof(pp)); h1=q1; if(!fscanf(fp2,"%s %s %s %f %f %f %f\n",q1->no2,q1->no1,q1->name1,&q1->score_,&q1->score[0],&q1->score[1],&q1->score[2])) { printf("文件B读取不成功\n"); exit(1); } printf("%s %s %s %f %f %f %f\n",q1->no2,q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2]); while(!feof(fp2)) { q2=(pp*)malloc(sizeof(pp));//新节点 if(!fscanf(fp2,"%s %s %s %f %f %f %f\n",q2->no2,q2->no1,q2->name1,&q2->score_,&q2->score[0],&q2->score[1],&q1->score[2])) { printf("文件读取失败\n"); exit(1); } printf("%s %s %s %f %f %f %f\n",q2->no2,q2->no1,q2->name1,q2->score_,q2->score[0],q2->score[1],q2->score[2]); q2->next1=NULL; q1->next1=q2; q1=q2; } fclose(fp2); return h1; } /******************************************************************************************************/ mimaxg()//密码修改。 { system("cls"); system("color fc"); system("title 密码修改"); FILE *mima; int i=0; char m1[10],m2[10],m3[10]; mima=fopen("my.txt","r"); fscanf(mima,"%s",m2); fclose(mima); do { printf("请输入原密码:"); scanf("%s",m1); i++; }while(strcmp(m1,m2)&&i<3);//输入3次错误就退出。 printf("请输入新密码:"); scanf("%s",m1); system("cls"); printf("请再次输入新密码:"); scanf("%s",m3); system("cls"); if(strcmp(m1,m3)==0) { printf("密码修改成功。\n"); mima=fopen("my.txt","w"); fprintf(mima,"%s",m1); } else { printf("两次输入密码不同,密码修改失败\n"); } fclose(mima); system("pause"); system("cls"); return 0; } /************************************************************************************/ int xinxips( STU *h,pp *h1)//信息排序 { pp *q1,*temp; STU *p1; int i=0,j,k; p1=h; q1=h1; while(q1!=NULL) { if(q1->score[2]!=-1) { q1->all=q1->score[0]*3/20+q1->score[2]*7/10+q1->score[1]*3/20; q1->aver=q1->all/3; q1=q1->next1; } else { q1->all=q1->score[0]*3/10+q1->score[2]*7/10; if(q1->all>=90) { q1->aver=q1->score_; } else { if(q1->all>=80) q1->aver=q1->score_*4/5; else { if(q1->all>=70) { q1->aver=q1->score_*3/4; } else { if(q1->all>60) { q1->aver=q1->score_*3/5; } else { if(q1->all<60) q1->aver=0; } } } } q1=q1->next1; } } q1=h1; for(k=0;k<i;k++) for(j=0;j<i;j++) { if(q1->all<q1->next1->all) { temp=(pp*)malloc(sizeof(pp)); strcpy(temp->no2,q1->no2); strcpy(temp->no1,q1->no1); strcpy(temp->name1,q1->name1); temp->score_=q1->score_; temp->score[0]=q1->score[0]; temp->score[1]=q1->score[1]; temp->score[2]=q1->score[2]; temp->all=q1->all; temp->aver=q1->aver; strcpy(q1->no2,q1->next1->no2); strcpy(q1->no1,q1->next1->no1); strcpy(q1->name1,q1->next1->name1); q1->score_=q1->next1->score_; q1->score[0]=q1->next1->score[0]; q1->score[1]=q1->next1->score[1]; q1->score[2]=q1->next1->score[2]; q1->all=q1->next1->all; q1->aver=q1->next1->aver; strcpy(q1->next1->no2,temp->no2); strcpy(q1->next1->no1,temp->no1); strcpy(q1->next1->name1,temp->name1); q1->next1->score_=temp->score_; q1->next1->score[0]=temp->score[0]; q1->next1->score[1]=temp->score[1]; q1->next1->score[2]=temp->score[2]; q1->next1->all=temp->all; q1->next1->aver=temp->aver; free(temp); } } q1=h1; while(q1!=NULL) { printf("%s %s %s %f %f %f %f %f %f\n",q1->no2,q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2],q1->all,q1->aver); q1=q1->next1; } return 0; } /**************************************************************************************/ //按学号查找模块 void nosearch(STU*h,pp*h1) { STU*p;//移动指针 pp*q1; char s[10]; printf("请输入想要查找的学号:\n");//提示输入学号 scanf("%s",s);//输入学号 p=h;//将头指针赋给p q1=h1; while(p!=NULL&&strcmp(p->no,s))//当记录不是要找的且指针不为空 p=p->next;//移动指针到下一结点继续查找 if(p==NULL) printf("对不起,查无此人!\n"); else printf("************************查询结果***********************\n"); printf("学 号:%-11s 姓 名:%-15s",p->no,p->name); if(strcmp(q1->no2,p->no)==0) { while(q1!=NULL) { printf("课程编号:%-11s 课程名称:%-30s 综合成绩:%7.2f 实得学分:%6.2f 排名%d\n",q1->no1,q1->name1,q1->all,q1->aver,q1->paiming); q1=q1->next1; } } printf("---------------------------------------------------\n"); printf("********************************************************\n"); } /******************************************************************************/ //按姓名查找模块 void namesearch(STU*h,pp*h1) { STU*p; char s[20];//定义数组存放姓名 pp *q1; printf("请输入想要查找的姓名:\n"); scanf("%s",s); p=h; q1=h1; while(p!=NULL&&strcmp(p->name,s)) p=p->next; if(p==NULL) printf("对不起,查无此人!\n"); else printf("************************查询结果***********************\n"); printf("学 号:%-11s 姓 名:%-15s,p->no,p->name\n"); printf("-------------------------------------------------------\n"); if(strcmp(q1->name1,p->name)==0) { while(q1!=NULL) { printf("课程编号:%-11s 课程名称:%-30s 综合成绩:%7.2f 实得学分:%6.2f 排名%d",q1->no1,q1->name1,q1->all,q1->aver,q1->paiming); q1=q1->next1; } } printf("********************************************************\n"); } /*****************************************************************************/ STU*xinxicr1( STU *h) { STU *p1; char b[10]; p1=h; printf("开始插入信息\n"); printf("如需放弃,请按####,否则请按123\n"); scanf("%s",b); if(strcmp(b,"####")==0) return 0; p1=(STU*)malloc(sizeof(STU)); if(!p1) { printf("内存分配失败\n"); return NULL; } printf("请输入学号:"); scanf("%s",p1->no); printf("请输入姓名:"); scanf("%s",p1->name); printf("性别:"); scanf("%s",p1->sex); printf("宿舍号:"); scanf("%s",p1->num); printf("电话号码:"); scanf("%s",p1->tel); p1->next=NULL; p1->next=h; h=p1->next; printf("学生信息已经添加到第一个,若想查看排名,请重新检索\n"); return h; } /***************************************/ pp *xinxicr2(pp*h1) { pp *q1; q1=h1; int k,i; printf("请输入课程数:"); scanf("%d",&k); for(i=0;i<k;i++) { printf("请输入课程[%d]得名称:",i); scanf("%s",q1->name1); printf("\t编号:"); scanf("%s",q1->no1); printf("\t学分数:"); scanf("%f",&q1->score_); do { printf("\t平时成绩:"); scanf("%f",&q1->score[0]); if(q1->score[0]>100||q1->score[0]<0) printf("输入非法,请重新输入\n"); }while(q1->score[0]>100||q1->score[0]<0); do { printf("\t实验成绩:"); scanf("%f",&q1->score[1]); if(q1->score[1]>100||q1->score[1]<0) printf("输入非法,请重新输入\n"); }while(q1->score[1]>100||q1->score[1]<0); do { printf("\t卷面成绩:"); scanf("%f",&q1->score[2]); if(q1->score[2]>100||q1->score[2]<0) printf("输入非法,请重新输入\n"); }while(q1->score[2]>100||q1->score[2]<0); } q1->next1=NULL; q1->next1=h1; h1=q1->next1; return h1; } /***************************************************/ STU *delete_1(STU *h) { char a[5],n; STU *p1,*p2; printf("请输入要删除的学号\n"); scanf("%s",a); p1=h; p2=h; while(p1!=NULL&&strcmp(p1->no,a)) { p2=p1; p1=p1->next; } if(p1=NULL) printf("\n没有您要删除的对象,请确认后再操作\n"); else { printf("%s\t%s\t%s\t",p1->no,p1->name,p1->sex); printf("您确实要删除此对象吗 (y/n)\n"); scanf("%c",&n); if(n=='y'||n=='Y') { if(p1==h) { h=p1->next; } else { p2->next=p1->next; } free(p1); printf("记录已删除\n"); } } return h; } /*********************************************************/ pp *delete_1(pp*h1) { pp *q1,*q2; char a[5]; printf("请再次输入你要删除的学号确认\n"); scanf("%s",a); q1=h1; q2=h1; while(q1!=NULL) { q2=q1; q1=q1->next1; } if(q1==h1) { h1=q1->next1; } else { q2->next1=q1->next1; } free(q1); printf("信息已彻底删除"); return h1; } /**********************************************************/ xinxibc(STU*h,pp*h1) { STU *p1,*p2; pp *q1; FILE *fp; int i=0,j; p1=h; p2=h; q1=h1; char a[20]; printf("请输入你想保存到文档的文件名,如果存在,也需要输入(全名称)"); scanf("%s",a); fp=fopen(a,"w+"); if(!fp) { printf("文件打开或创建失败\n"); return NULL; } while(p1!=NULL) { p1=p1->next; i++; } p1=h; for(j=0;j<i;j++) { fprintf(fp,"%s\t%s\t%s\t%s\t%s",p1->no,p1->name,p1->sex,p1->num,p1->tel); do { if(strcmp(q1->no2,p1->no)==0) { while(q1!=NULL) { fprintf(fp,"%s\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n",q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2],q1->all,q1->aver,q1->paiming); q1=q1->next1; } q1=h1; break; } q1=q1->next1; }while(q1!=NULL); p1=p1->next; } printf("文本保存成功\n"); fclose(fp); return 0; } /**********************************************************************/ void main()//主函数 { FILE *mima; char m1[10],m2[10]; int i; pp *h1; STU *h; mima=fopen("my.txt","r");//密码验证 if(!mima) { printf("密码文件打开失败\n"); exit(1); } fscanf(mima,"%s",m2); system("title 口令验证");//标题修改 do { printf("请输入正确的密码:"); scanf("%s",m1); system("cls"); system("pause"); }while(strcmp(m1,m2)); while(1)//主界面 { system("color a5"); system("title 学生信息管理系统"); printf(" *******************学生信息管理系统******************\n"); printf(" * 0 从B中读取学生的课程信息 *\n"); printf(" * 1 直接从目录A下读取学生数据 * \n"); printf(" * 2 对所输入的信息进行检索整理排序! *\n"); printf(" * 3 按学号查找学生信息 *\n"); printf(" * 4 按姓名查找学生信息 *\n"); printf(" * 5 插入记录 *\n"); printf(" * 6 删除记录 *\n"); printf(" * 7 进行信息保存,保存文本在当前 *\n"); printf(" * 8 密码修改 *\n"); printf(" * 9 退出 *\n"); printf(" *****************************************************\n"); do { printf("请输入(1-9):"); scanf("%d",&i); }while(i<0||i>9); switch(i) { case 0: h1=xinxib();break; case 1: h=xinxia();break; case 2: xinxips(h,h1);break; case 3: nosearch(h,h1);break; case 4: namesearch(h,h1);break; case 5: { h=xinxicr1(h); h1=xinxicr2(h1); }break;//怎么样把两个首地址传出来,这里有问题 case 6: { h=delete_1(h); h1=delete_1(h1); }break; case 7: xinxibc(h,h1);break; case 8: mimaxg();break; case 9: exit(0); default: system("color fc");break; } system("pause"); system("cls"); } }
FileRecv.zip
(969 Bytes)
A.TXT和B.TXT还有密码文本都在这个包里,原始密码为12345
谢谢啦啦!!!