#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#define Rule_Teacher 1
#define Rule_Student 2
struct stuAccountInfo
{
//账号密码权限
char szAccount[21];
char szPassword[21];
int iRule;
//使用fwrite和fread可以将结构体直接写入文件
};
typedef struct StuInfo
{
char StuNum[21];
char StuName[21];
char StuSex[2];
int StuAge;
}StuInfo_TYPE;
/*
StuInfo_TYPE[10000]设置缓存
先把文档里所有的数据全部加载到缓存中
以后所有的访问或修改数据都是对缓存进行操作
软件退出或程序在某个时候保存一下数据
有可能造成数据丢失(非正常退出的情况下)
意义:可以不用频繁的读取文件
*/
int RegisterAccount(void)
{
char account[21];
char password[21];
char bufAccount[21]={0};
int len,rule;
bool accountFlag = true;
FILE *pfile = fopen("AccountInfo.txt","r+");
if(pfile == NULL)
{
return 0;
}
printf("请输入账号:");
gets(account);
while(accountFlag)//判断账号是否已经存在并且符合要求
{
len = strlen(account);
accountFlag = false;
if(len<6 || len>20)
{
printf("账号长度应为6-20\n请重新输入:");
accountFlag = true;
}
while(fgets(bufAccount,len+1,pfile))
{
if(strcmp(bufAccount,account) == 0)
{
printf("此账户已存在\n请重新输入:");
accountFlag = true;
break;
}
}
if(accountFlag)
gets(account);
}
printf("请输入密码:");
gets(password);
printf("请问你是老师(1)还是学生(2):");
scanf("%d",&rule);
fprintf(pfile,"%s %s %d\n",account,password,rule);
fclose(pfile);
return rule;
}
int EnterSystem(void)
{
int len,rule;
char szCurAccount[21];
char szCurPassword[21];
char bufAccountAndPass[45]={0};
char bufStr[45]={0};
printf("******欢迎使用学生信息管理系统******\n");
printf("输入用户名(输入res注册):\n");
gets(szCurAccount);
if(strcmp(szCurAccount,"res") == 0)
{
rule = RegisterAccount();
if(rule);
return rule;
}
printf("输入密码:\n");
gets(szCurPassword);
sprintf(bufAccountAndPass,"%s %s",szCurAccount,szCurPassword);
FILE *AccountInfo = fopen ("AccountInfo.txt","r");
if(AccountInfo == NULL)
{
printf("打开失败\n");
return false;
}
while(fgets(bufStr,45,AccountInfo))
{
len = strlen(bufAccountAndPass);
if(strncmp(bufStr,bufAccountAndPass,len) == 0)
{
len= strlen(bufStr)-2;//文件一句话后面的换行符
rule = bufStr[len]-'0';
fclose(AccountInfo);
return rule;
}
}
fclose(AccountInfo);
return false;
}
void ShowTeacherWindow(void)
{
printf("******欢迎使用学生信息管理系统******\n");
printf("0:添加学生信息 ");
printf("1: 删除学生信息\n");
printf("2: 修改学生信息 ");
printf("3: 查找学生信息\n");
printf("4: 打印所有学生信息");
printf("5: 退出\n");
}
void ShowStudentWindow(void)
{
printf("******欢迎使用学生信息管理系统******\n");
printf("0: 查找学生信息 ");
printf("1: 打印所有学生信息\n");
printf("2: 退出\n");
}
bool IsStuNumExist(char *StuNum)
{
char bufStuNum[21];
int len = strlen(StuNum);
FILE *fp = fopen("StudentInfo.txt","r+");
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
return true;
}
}
return false;
}
void AddStuInfo(void)
{
StuInfo_TYPE newStu;
FILE *fp = fopen("StudentInfo.txt","a+");
if(fp == NULL)
{
printf("打开文件失败\n");
return ;
}
printf("增加同学的学号:");
gets(newStu.StuNum);
if( IsStuNumExist(newStu.StuNum) )
{
int command;
printf("此同学信息已被添加\n继续添加请输入1(按其他任意键退出):");
scanf("%d",&command);
getchar();
if(command == 1)
{
printf("增加同学的学号:");
gets(newStu.StuNum);
}
else
return;
}
printf("这位同学的名字: ");
gets(newStu.StuName);
printf("这位同学的性别: ");
scanf("%s",&newStu.StuSex);
printf("这位同学的年龄: ");
scanf("%d",&newStu.StuAge);
getchar();
fprintf(fp,"%s %s %s %d\n",newStu.StuNum,newStu.StuName,newStu.StuSex,newStu.StuAge);
fclose(fp);
}
void DeleteStuInfo(void)
{
char bufStuNum[45];
char StuNum[21];
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要删除信息学生的学号: ");
gets(StuNum);
int len = strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
len = strlen(bufStuNum)+1;
fseek(fp,-len,SEEK_CUR);
fprintf(fp,"NULL");
break;
}
}
fclose(fp);
}
void ChangeStuInfo(void)
{
char newInfo[45];
char StuNum[21];
char bufStuNum[45];
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要修改信息学生的学号");
gets(StuNum);
int len = strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
printf("请输入修改后的学生信息: ");
gets(newInfo);
len = strlen(bufStuNum) + 1;
fseek(fp,-len,SEEK_CUR);
fprintf(fp,"%s\n",newInfo);
break;
}
}
fclose(fp);
}
void FindStuInfo(void)
{
char bufStuNum[45];
char StuNum[21];
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要查找信息学生的学号: ");
gets(StuNum);
int len=strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
printf("该学生信息为:\n%s",bufStuNum);
break;
}
}
fclose(fp);
}
void PrintAllStuInfo(void)
{
char bufStu[45];
FILE *fp = fopen("StudentInfo.txt","r+");
while(fgets(bufStu,45,fp))
{
printf("%s",bufStu);
}
fclose(fp);
}
int main()
{
bool flag = 1;
int Command,iRule;
iRule = EnterSystem();
if(iRule == Rule_Teacher)
{
printf("账号登陆成功\n");
while(flag)
{
ShowTeacherWindow();
scanf("%d",&Command);
getchar();
switch (Command)
{
case 0:AddStuInfo();
break;
case 1:DeleteStuInfo();
break;
case 2:ChangeStuInfo();
break;
case 3:FindStuInfo();
break;
case 4:PrintAllStuInfo();
break;
case 5:flag = 0;
break;
default:printf("请输入0-5的操作数\n");
}
}
}
else if(iRule == Rule_Student)
{
printf("账号登陆成功\n");
while(flag)
{
ShowStudentWindow();
scanf("%d",&Command);
getchar();
switch (Command)
{
case 0:FindStuInfo();
break;
case 1:PrintAllStuInfo();
break;
case 2:flag = 0;
break;
default:printf("请输入0-2的操作数\n");
}
}
}
else
printf("账号密码错误,登陆失败\n");
return 0;
}