包含功能
1、账号的登录和注册,密码加密。
2、登录退出的日志记录。
3、创建学生信息。可通过键盘输入或文件导入来创建初始学生信息。
4、增加学生信息。可通过键盘输入或文件导入将学生信息按学号升序插入学生信息。
5、浏览学生信息,将磁盘内所有学生信息打印在屏幕上。
6、修改学生信息。1)根据提供的学号查找并修改学生信息,可以只修改部分信息,由运行界面的交互信息来进行提示;2)找不到时给出提示;
7、查找学生信息,1)通过学号或姓名来查找学生信息可多次查找;2)找不到时给出提示;
8、删除学生信息。1)通过学号查找要删除的学生信息,且可删除多个学生信息,并将信息保留在另一文件里;2)找不到时给出提示,并可进行增加学生信息;
9、保存信息并退出。
编写过程中我遇到的问题在之前博客里有讲。
所用到的文件 文件要代与码文件放在一个目录下
储存账信号息的文件:User Information.txt
储存登录日志的文件:journal.txt
储存学生信息的文件:Student Information.txt
储存被删掉的数据的文件:Deleted Information.txt
创建学生信息的文件://数据格式如①,具体文件自己创建
增加学生信息的文件://数据格式如①,具体文件自己创建
①
学生信息在文件中的存放格式:数据以空格隔开,按学号升序换行存放。
②键盘输入学生信息格式要求:数据以空格隔开,与文件数据格式一样,按学号升序输入
学号 姓名 性别 出生日期 语文 数学 英语
关于中文文字乱码处理
其他人在CSDN上有解答
账号 密码以空格隔开,密码已被加密,密钥在代码中。
.cpp代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define key 0x86 //定义密钥
struct data
{
int year; //年
int month; //月
int day; //日
};
struct student
{
int snum; //学号
char name[10]; //姓名
char sex; //性别
struct data birthday; //出生日期
int score[3] ; //课程成绩
};
typedef struct node
{
struct student data; //结点数据域
struct node * next; //结点指针域
}Node;
typedef struct user//记录用户信息
{
char name[20];
char password[20];
struct user *next;
}User;
void PageInitilalization();//功能界面
int sign();//用户登录 注册
int ExamInformation(char input_username[], char input_password[]);//登录账号
int Examing(char input_username [], char input_password[], char file_username[], char file_password[]); //账号验证 当返回值为2时,账号密码均正确;为1时,仅账号正确;为0时,账号密码均错误
void CreatInformation();//1创建信息
void AddInformation();//2增加学生信息
void PrintInformation();//3浏览信息
void changeInformation();//4修改信息
void change_snum(Node *stu1,Node *stu2,Node *stu_first);//修改学号
void change_name(Node *stu2,Node *stu_first);//修改姓名
void change_sex(Node *stu2,Node *stu_first);//修改性别
void change_data(Node *stu2,Node *stu_first);//修改出生日期
void change_grade(Node *stu2,Node *stu_first);//修改成绩
void change_all(Node *stu1,Node *stu2,Node *stu_first); //全部修改
void FindInformation();//5查找信息
void DeleteInfortmation();//6删除信息
Node *GetFileInformation(char s[]);//从文件中获取信息
void InformationToFile(Node *s1,Node *s2);//将链表中信息打印到文件中
int main()
{
PageInitilalization();
}
void PageInitilalization()//初始界面
{
int choose = -1;
FILE *f1 ;
f1 = fopen("journal.txt","a") ;
if(sign())//登录成功
{
printf("登录成功\n");
system("pause");
system("cls");
int i = 1;
while(i)
{
printf("==================学生信息管理系统==================\n");
printf("===================================================\n");
printf(" 0---保存信息并退出 \n");
printf(" 1---创建学生信息 \n");
printf(" 2---增加学生信息 \n");
printf(" 3---浏览学生信息 \n");
printf(" 4---修改学生信息 \n");
printf(" 5---查找学生信息 \n");
printf(" 6---删除学生信息 \n");
printf("===================================================\n");
printf("\n请输入选项0--6:");
while(!scanf("%d",&choose) || choose > 6 || choose < 0)//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
system("cls");
i = choose;//当choose == 0 时,不进行下一次循环
switch(choose)
{
case 0:goto exit;break;//保存并退出
case 1:CreatInformation();break;//1创建文件信息
case 2:AddInformation();break;//2增加学生信息
case 3:PrintInformation();break;//4浏览信息
case 4:changeInformation();break;//修改信息
case 5:FindInformation();break;//5查找信息
case 6:DeleteInfortmation();//6删除信息
}
}
}
else printf("程序结束"); //登录不成功时,选择退出
while(0)//退出并保留信息
{
exit://goto语句
SYSTEMTIME sys;//获取系统时间
GetLocalTime( &sys );
printf("信息已保存,退出登录成功");
//记录退出时间 ,并打印在日志文件里
fprintf(f1," 退出时间:%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
fclose(f1) ;
}
}
int sign()//用户登录 注册
{
int i = 1,choose = 0;
char input_username[20] = {
0},input_password[20] = {
0};
printf("==================学生信息管理系统==================\n");
printf("----------------------------------------------------\n");
printf(" 1---登录 \n");
printf(" 2---注册 \n");
printf("----------------------------------------------------");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
system("cls");
if(choose == 1)//登录账号
{
login://goto语句
printf("*******************用户登录*******************\n");
while(i)
{
printf("请输入用户名:");
while(!scanf("%s",input_username))
{
printf("输入错误,请重新输入\n");
fflush(stdin);
}
printf("请输入密码:");
while(! scanf("%s",input_password))
{
printf("输入错误,请重新输入\n");
fflush(stdin);
}
i = ExamInformation(input_username,input_password);//判断账号密码是否正确 ,如果正确i=1,错误为 0;
if(i) break;
else if(!i)//账号密码 错误时
{
printf("----------------------------------------------------\n");
printf("0---退出\n");
printf("1---重试\n");
printf("2---注册\n");
printf("----------------------------------------------------\n");
while(!scanf("%d",&i) || i < 0 || i >2 )
{
printf("输入错误,重新输入\n");
fflush(stdin);
}
system("cls");
if(i == 2)
{
i = 1;
goto Register;//注册
break;
}
}
}
return i;
}
else if(choose == 2)//注册账号
{
Register://由登录转注册
FILE*f1;
f1 = fopen("User Information.txt","a");
printf("*******************账号注册*******************\n");
printf("请输入用户名(以英文输入模式,输入小于20个字符,不支持空格符、制表符、换行符):\n");
while(!scanf("%s",input_username))
{
printf("输入错误,请重新输入\n");
fflush(stdin);
}
printf("请输入密码(以英文输入模式,输入小于20个字符,不支持空格符、制表符、换行符):\n");
while(! scanf("%s",input_password))
{
printf("输入错误,请重新输入\n");
fflush(stdin);
}
for(int i = 0;i < strlen(input_password);i++)//对密码进行异或加密
{
input_password[i] = input_password[i] ^ key;
}
fprintf(f1,"%s %s\n",input_username,input_password);//打印到用户信息文件里
fclose(f1);
printf("账号注册成功, \n按回车键继续.......返回登录界面\n");
system("pause");
system("cls");
goto login;//返回登录页面
}
}
int ExamInformation(char input_username[],char input_password[])//登录验证
{
FILE *f2,*f3;
User s ;
int i = 0;
f2 = fopen("User Information.txt","r");
f3 = fopen("journal.txt","a");
int error = 0;
while(!feof(f2))//获取文件信息
{
SYSTEMTIME sys; //获取系统时间
GetLocalTime( &sys );
if(fscanf(f2,"%s %s",s.name,s.password) == 2) //判断是否获取到正确数据
{
if(Examing(input_username,input_password,s.name,s.password) == 2)//账号密码 均正确
{
printf("账号密码正确,登录成功\n");
i = 1;
//记录用户名和登录时间 精确到毫秒
fprintf(f3,"%s 登录时间: %4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d",s.name,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
break;
}
else if(Examing(input_username,input_password,s.name,s.password) == 1)//仅账号正确
{
printf("密码错误\n");
break;
}
}
else //文件账号密码存放格式错误提示
{
if(error == 1)//至少会出现一次为EOF
{
printf("文件信息格式错误");
}
error++;
}
}
if(feof(f2))//无匹配账号时
{
printf("账号密码错误\n");
}
fclose(f2);
fclose(f3);
return i;
}
int Examing(char input_username[],char input_password[],char file_username[],char file_password[])//账号密码检验
{
int i = 0;
char *s = input_password;
if(strcmp(input_username,file_username) == 0)//验证账号
{
i++;
while(*s != '\0')//密码加密
{
*s = *s ^ key;
s++;
}
if(strcmp(input_password,file_password) == 0)//验证密码
{
i++;
}
}
return i;
}
void CreatInformation()//1---创建信息
{
int choose = 0;
printf("*****************学生信息的创建******************\n");
printf("-------------------------------------------------");
printf("\n 1---从键盘输入数据信息 ");
printf("\n 2---从文件读取数据信息 \n");
printf("-------------------------------------------------");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
if(choose == 1) //从键盘输入学生信息
{
FILE *f1;
f1 = fopen("Student Information.txt","w");
Node *p = NULL,*fp = NULL;
int number = 0;
printf("你选择了从键盘输入数据,请继续......");
printf("请输入学生人数:\n");
while(!scanf("%d",&number))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入学生人数:\n");
}
printf("请按照 学号 姓名 性别 出生日期 语文 数学 英语的顺序输入每个学生的信息(按学号升序输入)如:\n");
printf("1005 tom M 2000-1-1 87 80 90\n");
p = (Node *)malloc(sizeof(Node ) * number);//申请长度为number
for(int i = 0;i < number;i ++)//从键盘获取信息
while(scanf("%d %s %c %d-%d-%d %d %d %d",&(p+i) -> data.snum, (p+i) -> data.name, &(p+i)->data.sex, &(p+i) -> data.birthday.year,
&(p+i) -> data.birthday. month, &(p+i) -> data.birthday.day, &(p+i) -> data.score[0], &(p+i) -> data.score[1], &(p+i) -> data.score[2])!=9)//数据输入异常处理
{
fflush(stdin);
printf("本次输入错误,请重新输入:\n");
}//数据输入异常分析
for(int i = 0;i < number;i ++)// 将信息从链表储存到文件Student Information.txt
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",(p+i) -> data.snum, (p+i) -> data.name, (p+i)->data.sex, (p+i) -> data.birthday.year,
(p+i) -> data.birthday. month, (p+i) -> data.birthday.day, (p+i) -> data.score[0], (p+i) -> data.score[1], (p+i) -> data.score[2]);
free(p);
fclose(f1);
}
else //从文件获取学生信息
{
FILE *f2;
char filename[20] = {
0};
Node *s = NULL,*p = NULL;
printf("你选择了从文件输入数据,请继续......\n");
printf("文件信息需按照“学号 姓名 性别 出生日期 语文 数学 英语”格式(按学号升序换行存放)");
printf("请输入文件名称:");
while(!scanf("%s",filename))//获取文件名
{
printf("文件名输入错误\n");
fflush(stdin);
}
s = GetFileInformation(filename)->next; //将文件信息存在链表,并返回表头,头不存值
InformationToFile(s,p);//用已有函数,文件链表与空的链表比较信息,将文件链表打印到学生信息文件里
}
printf("创建成功!\n按回车键继续.......返回主界面");
system("pause");
system("cls");
}
void AddInformation()//2---增加信息
{
int choose = 0;
char filename1[30] = "Student Information.txt";
printf("*******************学生信增加*******************\n");
printf("-------------------------------------------------");
printf("\n 1---从键盘输入数据信息 ");
printf("\n 2---从文件读取数据信息 \n");
printf("-------------------------------------------------");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
if(choose == 1) //从键盘输入学生信息
{
Node *p = NULL,*s1 = NULL,*s = NULL,*s2 = NULL;
//Node *first = NULL,*add = NULL,*last = NULL;
FILE *f1;
int number = 0;
printf("你选择了从键盘输入数据,请继续......");
printf("请输入学生人数:\n");
while(!scanf("%d",&number))//数据输入错误处理
{
fflush(stdin);
printf("输入错误,请输入学生人数:\n");
}
printf("请按照 学号 姓名 性别 出生日期 语文 数学 英语的顺序输入每个学生的信息如:\n");
printf("1005 tom M 2000-1-1 87 80 90\n");
s1 = (Node*)malloc(sizeof(Node));//表头
s1->next = NULL;
s = s1;
for(int i = 0;i < number;i++)//动态申请
{
p = (Node *)malloc(sizeof(Node));
p->next = NULL;
while(scanf("%d %s %c %d-%d-%d %d %d %d",&p -> data.snum, p -> data.name, &p->data.sex, &p -> data.birthday.year,
&p -> data.birthday. month, &p -> data.birthday.day, &p -> data.score[0], &p -> data.score[1], &p -> data.score[2])!=9)//数据输入异常处理
{
fflush(stdin);
printf("本次输入错误,请重新输入:\n");
}//数据输入异常处理
s->next = p;
s = s->next;
}
s1 =s1->next;
s2 = GetFileInformation(filename1)->next;//获取文件信息
InformationToFile(s1,s2) ;//s2为Student Information.txt,
}
else //从文件获取学生信息
{
char filename2[20] = {
0};
Node *s1 = NULL,*s2 = NULL;
printf("你选择了从文件输入数据,请继续......\n");
printf("请输入文件名称:");
while(!scanf("%s",filename2))//获取文件名
{
fflush(stdin);
printf("文件名输入错误");
}
s1 = GetFileInformation(filename2)->next;//函数返回表头为空
s2 = GetFileInformation(filename1)->next;
InformationToFile(s1,s2) ;//s2为Student Information.txt,s1为增加信息的文件
}
printf("学生信息增加成功\n按回车键继续.......返回主界面");
system("pause");
system("cls");
}
void PrintInformation()//3---浏览信息
{
FILE *f1 ;
Node p;
int i = 0;
f1 = fopen("Student Information.txt","r");
printf(" 所有学生信息如下\n");
printf("学号 姓名 性别 出生日期 语文 数学 英语\n");
while(!feof(f1))//将信息打印在屏幕上
{
if(fscanf(f1,"%d %s %c %d-%d-%d %d %d %d",&p.data.snum,p.data.name,&p.data.sex,&p.data.birthday.year,&p.data.birthday.month,
&p.data.birthday.day,&p.data.score[0],&p.data.score[1],&p.data.score[2]) == 9)
printf("%d %d %s %c %d-%d-%d %d %d %d\n",i,p.data.snum,p.data.name,p.data.sex,p.data.birthday.year,p.data.birthday.month,
p.data.birthday.day,p.data.score[0],p.data.score[1],p.data.score[2]) ;
i++;
}
fclose(f1);
printf("学生信息打印完毕!\n按回车键继续.......返回主界面");
system("pause");
system("cls");
}
void changeInformation()//4---修改信息
{
char filename[30] = "Student Information.txt";
Node *first = NULL;
int choose1 = 0;
int time = 1;
while(time)
{
first = GetFileInformation(filename)->next;
printf("*****************修改学生信息******************\n");
printf("-----------------------------------------------\n");
printf(" 1---输入要修改的学生的学号\n");
printf(" 2---返回上已界面\n");
printf("-------------------------------------------------");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose1) || choose1 < 1 || choose1 > 2)//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
if(choose1 == 1)//修改信息
{
int sunm1 = 0;
Node *stu_first = NULL,*stu1 = NULL,*stu2 = NULL;
printf("请输入学生学号:");
while(!scanf("%d",&sunm1))
{
printf("输入错误,请输入学号");
fflush(stdin);
}
stu_first = GetFileInformation(filename);
stu1 = stu_first;
stu2 = stu_first->next;
while(stu2 && stu2->data.snum != sunm1)//检索信息
{
stu1 = stu1->next;
stu2 = stu2->next;
}
if(!stu2)
{
printf("无该学生信息\n");
system("pause");
printf("-----------------------------------------------\n");
printf("\n0---停止查找\n1---继续查找其他学生信息\n2---增加该学生信息\n");
printf("-----------------------------------------------\n");
printf("请输入:");
while(!scanf("%d",&time) || time > 2 || time < 0)
{
printf("输入错误,请重新输入");
fflush(stdin);
}
if(time == 2 || time == 0)
{
if(time == 2) //增加文件信息
{
AddInformation();
system("cls");
}
break;
}
system("cls");
}
else//有该学号的学生信息
{
int choose2 = 0;
printf("该学生生信息为:学号 姓名 性别 出生日期 语文 数学 英语\n%d %s %c %d-%d-%d %d %d %d\n",stu2->data.snum,stu2->data.name,stu2->data.sex,stu2->data.birthday.year,stu2->data.birthday.month,stu2->data.birthday.day,
stu2->data.score[0],stu2->data.score[1],stu2->data.score[2]);
printf("-------------------------------------------------\n");
printf(" 0---不修改\n");
printf(" 1---只修改学生学号\n");
printf(" 2---只修改学生的姓名\n");
printf(" 3---只修改学生性别\n");
printf(" 4---只修改学生出生日期\n");
printf(" 5---只修改学生成绩\n");
printf(" 6---修改学生所有信息\n");
printf("-------------------------------------------------\n");
printf("请输入0--6:");
while(!scanf("%d",&choose2) || choose2 < 0 || choose2 >6)//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
system("cls");
printf("该学生信息为:学号 姓名 性别 出生日期 语文 数学 英语\n%d %s %c %d-%d-%d %d %d %d\n",stu2->data.snum,stu2->data.name,stu2->data.sex,stu2->data.birthday.year,stu2->data.birthday.month,stu2->data.birthday.day,
stu2->data.score[0],stu2->data.score[1],stu2->data.score[2]);
switch(choose2)//修改选择
{
case 0:break;
case 1:change_snum(stu1,stu2,stu_first); break;//修改学号
case 2:change_name(stu2,stu_first); break;//姓名
case 3:change_sex(stu2,stu_first); break;//性别
case 4:change_data(stu2,stu_first); break;//出生日期
case 5:change_grade(stu2,stu_first); break;//成绩
case 6:change_all(stu1,stu2,stu_first);//所有
}
if(choose2)//修改时
printf("学生信息修改成功!\n按回车键继续");
system("pause");
printf("\n输入0停止查找,输入其他继续查找\n");
printf("请输入:");
while(!scanf("%d",&time))
{
printf("输入错误,请重新输入");
fflush(stdin);
}
system("cls");
}
}
else//不修改
{
time = 0;
}
}
system("pause");
system("cls");
}
void change_snum(Node *stu1,Node *stu2,Node *stu_first)//1修改学号
{
printf("请输入要改成的学号:");
scanf("%d",&stu2->data.snum);
stu1->next = stu2->next;
stu2->next = NULL;
InformationToFile(stu2,stu_first->next);
}
void change_name(Node *stu2,Node *stu_first)//2修改姓名
{
Node *p = NULL;
printf("请输入要改成的姓名:");
scanf("%s",stu2->data.name);
InformationToFile(p,stu_first->next);
}
void change_sex(Node *stu2,Node *stu_first)//3修改性别
{
Node *p = NULL;
printf("请输入要改成的性别:");
fflush(stdin);
scanf("%c",&stu2->data.sex);
InformationToFile(p,stu_first->next);
}
void change_data(Node *stu2,Node *stu_first)//4修改出生日期
{
Node *p = NULL;
printf("请输入要改成的出生日期,格式如:\n2000-3-3\n");
scanf("%d-%d-%d",&stu2->data.birthday.year,&stu2->data.birthday.month,&stu2->data.birthday.day);
InformationToFile(p,stu_first->next);
}
void change_grade(Node *stu2,Node *stu_first)//5修改成绩
{
Node *p = NULL;
printf("请输入要改成的成绩格式如:\n88 88 88\n");
scanf("%d %d %d",&stu2->data.score[0],&stu2->data.score[1],&stu2->data.score[2]);
InformationToFile(p,stu_first->next);
}
void change_all(Node *stu1,Node *stu2,Node *stu_first)//6修改全部信息
{
printf("请按照 学号 姓名 性别 出生日期 语文 数学 英语的顺序输入每个学生的信息如:\n");
printf("1005 tom M 2000-1-1 87 80 90\n");
scanf("%d %s %c %d-%d-%d %d %d %d",&stu2->data.snum,stu2->data.name,&stu2->data.sex,&stu2->data.birthday.year,&stu2->data.birthday.month,&stu2->data.birthday.day,
&stu2->data.score[0],&stu2->data.score[1],&stu2->data.score[2]);
stu1->next = stu2->next;
stu2->next = NULL;
InformationToFile(stu2,stu_first->next);
}
void FindInformation()//5---查找信息
{
Node *first = NULL;
int choose = 0;
char s[30] = "Student Information.txt";
int time = 1;
while(time)//设置重复查找
{
first = GetFileInformation(s)->next;
printf("*******************学生信息查找*******************\n");
printf("-------------------------------------------------\n");
printf(" 1---学号查找\n");
printf(" 2---姓名查找\n");
printf("-------------------------------------------------\n");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
if(choose == 1)//学号查找
{
int snum1 = 0;
printf("请输入学号:");
while(!scanf("%d",&snum1))
{
fflush(stdin);
printf("输入错误,请输入选项");
}
while(first && first->data.snum != snum1)//遍历链表
{
first = first->next;
}
if(!first)//无
{
printf("无该学生信息");
}
else//有该生信息
{
printf("该学生信息为:学号 姓名 性别 出生日期 语文 数学 英语\n%d %s %c %d-%d-%d %d %d %d",first->data.snum,first->data.name,first->data.sex,first->data.birthday.year,
first->data.birthday.month,first->data.birthday.day,first->data.score[0],first->data.score[1],first->data.score[2]);
}
}
else//姓名查找
{
char name[20] = {
0};
printf("请输入学生姓名:");
scanf("%s",name);
while(first && strcmp(first->data.name,name) != 0)//从左到右比较ASCII,小于为负,相等为0,大于为正
{
first = first->next;
}
if(!first)
{
printf("无该学生信息");
}
else//有该生信息
{
printf("该学生信息为:学号 姓名 性别 出生日期 语文 数学 英语\n%d %s %c %d-%d-%d %d %d %d",first->data.snum,first->data.name,first->data.sex,first->data.birthday.year,
first->data.birthday.month,first->data.birthday.day,first->data.score[0],first->data.score[1],first->data.score[2]);
}
}
system("pause");
printf("\n输入0停止查找,输入其他继续查找\n") ;
printf("请输入:");
while(!scanf("%d",&time))
{
printf("输入错误,请重新输入");
fflush(stdin);
}
if(time)
system("cls");
}
printf("学生信息查找结束,\n按回车键继续.......返回主界面");
system("pause");
system("cls");
}
void DeleteInfortmation()//6---删除信息
{
int choose = 0;
printf("*****************学生信息的删除******************\n");
printf("-------------------------------------------------\n");
printf(" 1---输入学号删除信息\n");
printf(" 2---返回上一层\n");
printf("-------------------------------------------------\n");
printf("\n请输入选项(1--2):");
while(!scanf("%d",&choose) || (choose != 1 && choose !=2))//数据输入异常处理
{
fflush(stdin);
printf("输入错误,请输入选项(1--2):\n");
}
if(choose == 1)//学号删除
{
int number = 0,snum1 = 0;
FILE *f1;
Node *first = NULL, *first1 = NULL,*first2 = NULL,*last = NULL;
char filename[30] = "Student Information.txt";
f1 = fopen("Deleted Information.txt","w") ;
first = GetFileInformation(filename);
printf("请输入要删除的学生信息人数:");
scanf("%d",&number);
for(int i = 0;i < number;i++)//删除学号
{
printf("请输入要删除的学生信息的学生学号:\n");
scanf("%d",&snum1);
first1 = first;
first2 = first->next;
while(first2 && first2->data.snum != snum1)//判断是否有该生信息
{
first1 = first1->next;
first2 = first2->next;
}
if(!first2)//无
{
printf("\n无学号为%d的学生的信息\n",snum1);
}
else//有该生信息
{
first1->next = first2->next;
first2->next = NULL;
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",first2->data.snum, first2->data.name, first2->data.sex,first2->data.birthday.year,
first2->data.birthday.month, first2->data.birthday.day, first2->data .score[0],first2->data.score[1], first2-> data.score[2]);
}
}
InformationToFile(last,first->next);
fclose(f1);
printf("学生信息删除成功");
printf("按回车件返回上一界面\n按回车键继续.......返回主界面");
system("pause");
system("cls");
}
else
{
printf("按回车键返回上一界面\n");
system("pause");
system("cls");
}
}
Node *GetFileInformation(char filename[])//获取文件信息,以链表方式储存,返回表头
{
FILE *f2;
Node *first = NULL,*last = NULL,*s = NULL;
f2 = fopen(filename,"r");
first = (Node *)malloc(sizeof(Node));//表头
first->next = NULL;//当文件为空时 ,return 的first->next 为随机值 会导致出错
last = first;
int error = 0;
while(!feof(f2))//获取文件信息
{
s = (Node *)malloc(sizeof(Node));
if(s == NULL)//申请失败提示
{
printf("Not able to allocate memory. \n");
exit(1);
}
s->next = NULL;
if(fscanf(f2,"%d %s %c %d-%d-%d %d %d %d",&s -> data.snum, s -> data.name, &s->data.sex, &s-> data.birthday.year,
&s -> data.birthday.month, &s -> data.birthday.day, &s -> data .score[0], &s -> data.score[1], &s -> data.score[2]) == 9) //确定链表是否获取到正确的数据
{
last -> next = s;//first为空
last = s;
}
else //文件格式错误提示
{
if(error == 1)//至少会出现一次为EOF
{
printf("文件信息格式错误");
free(s); //如果数据错误,释放空间
break; //停止读取数据
}
error++;
}
}
fclose(f2);
return first;
}
void InformationToFile(Node *s1,Node *s2)//将两个链表中数据按学号升序打印在文件 Student Information.txt
{
Node *p1 = NULL,*p2 = NULL,*p3 = NULL;
p1 = s1;
p2 = s2;
FILE *f1;
f1 = fopen("Student Information.txt","w");
printf("打印到Student Information.txt的信息:\n");
while(p1&&p2)//非空时比较
{
if(p1->data.snum < p2->data.snum)//学号小于
{
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p1 -> data.snum, p1 -> data.name, p1->data.sex,p1 -> data.birthday.year,
p1 -> data.birthday.month, p1 -> data.birthday.day, p1 -> data .score[0],p1 -> data.score[1], p1 -> data.score[2]);
printf("%d %s %c %d-%d-%d %d %d %d\n",p1 -> data.snum, p1 -> data.name, p1->data.sex,p1 -> data.birthday.year,
p1 -> data.birthday.month, p1 -> data.birthday.day, p1 -> data .score[0],p1 -> data.score[1], p1 -> data.score[2]);
p3 = p1;
p1 = p1->next;
free(p3);
}
else if(p1->data.snum > p2->data.snum)//学号大于
{
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
printf("%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
p3 = p2;
p2 = p2->next;
free(p3);
}
else//学号相同 打印Student Information.txt,内信息
{
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
printf("%d %s %c %d-%d-%d %d %d %d\n",p2 -> data.snum, p2 -> data.name, p2->data.sex,p2 -> data.birthday.year,
p2 -> data.birthday.month, p2 -> data.birthday.day, p2 -> data .score[0],p2 -> data.score[1], p2 -> data.score[2]);
p3 = p1;
p1 = p1->next;
free(p3);
p3 = p2;
p2 = p2->next;
free(p3);
}
}
if(p1)
p3 = p1;
else
p3 = p2;
while(p3)//继续将非空的链表打印到文件里
{
fprintf(f1,"%d %s %c %d-%d-%d %d %d %d\n",p3 -> data.snum, p3 -> data.name, p3->data.sex,p3 -> data.birthday.year,
p3 -> data.birthday.month, p3 -> data.birthday.day, p3 -> data .score[0],p3 -> data.score[1], p3 -> data.score[2]);
printf("%d %s %c %d-%d-%d %d %d %d\n",p3 -> data.snum, p3 -> data.name, p3->data.sex,p3 -> data.birthday.year,
p3 -> data.birthday.month, p3 -> data.birthday.day, p3 -> data .score[0],p3 -> data.score[1], p3 -> data.score[2]);
p1 = p3;
p3 = p3->next;
free(p1);
}
fclose(f1);
}
菜鸟一枚,如有错误,还请指正