这个程序的读取功能有点问题,自己找不出来了,麻烦大家看看
这个程序,从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");
}
}
A.TXT和B.TXT还有密码文本都在这个包里,原始密码为12345
谢谢啦啦!!!









