用fwrite写入的内容,在txt打开时是乱码。再次调用fread读取txt时,命令窗口会一直卡住。
#include <stdio.h>
#include <stdlib.h>
#define year 4 //定义大学年份为4年
#define MAX 10 //定义最大值
typedef //添加结构体名称
struct Student{
char name[10]; //存储学生姓名
int id;
int yw[4];
int sx[4];
int yy[4];
} stu; //修改结构体名称
stu student[10],temp; //声明 学生数组 和temp
int getStuSumFromStruct(){ //获取学生个数
int i=0;
for(;i<MAX; i++){
if( student[i].id==0 ){
return i;
}
}
}
void cleanTemp(){ //格式化temp
strcmp (temp.name, '0' );
strcmp (temp.id , '0' );
strcmp (temp.yw , '0' );
strcmp (temp.sx , '0' );
strcmp (temp.yy , '0' );
}
void meakTextToStruct(){ //1.文本 传入 结构体数组 2.更新结构体数组
FILE *fp;
fp = fopen("student.txt","r+");
if(fp == NULL){
printf("学生成绩数据文件丢失,即将退出系统!\n");
Sleep(3000);
exit(0);
}
int r;
int i=0; //记录读取到学生的个数
int flag=0;
r = fread(&student[i],sizeof(struct Student),1,fp); //把文件的内容全部读取到结构体student里面
while(r){
flag=1;
i++;
r = read(&student[i],sizeof(struct Student),1,fp);
}
if(flag){
printf("读取从文本成绩成功!\n");
}else{
printf("读取从文本成绩失败!请从管理员模式导入学生!\n");
}
fclose(fp);
}
void meakStructureToText(int writeNum ){ //结构体数组 传入 文本
FILE *fp = fopen("student.txt","w"); //写入文本 并且把原来文本的内容清除
int count=0;
while(count<writeNum){
fwrite(&student[count],sizeof(struct Student),1,fp);
count++;
}
fclose(fp);
}
void addStudent(){ //添加学生
printf("请输入要添加学生的学号:");
int id;
scanf("%d",&id);
int flag=0; //判断数组是否有该学号,默认不存在
int i=0;
int stuCount=0;
for(; i<MAX; i++){
if ( getStuSumFromStruct()>=10){
break;
}
if( student[i].id == id ){
printf("该学号 %d 已被录入!\n",student[i]);
flag=1;
break;
}
}
if(flag==0){
FILE *fp = fopen("student.txt","a+");//写入文件末尾
cleanTemp(); //格式化temp
temp.id = id;
printf("请输入该学生%d的名字:",temp.id);
char name[10];
scanf("%s",&name);
strcpy( temp.name , name );
fwrite(&temp,sizeof(stu),1,fp);
fclose(fp);
printf("学号 %d 录入成功\n",temp.id);
}
}
void findStudentGrade(){ //查询成绩
int count = getStuSumFromStruct(); //并且获取数组有效学生个数
meakTextToStruct(); //更新结构体数组
int id;
int count2=0; //记录在结构体查找学生的次数
printf("请输入学号:");
scanf("%d",&id);
for(;count<=count2;){
if( strcmp(student[count2].name , id)!=0 ){
printf("已找到学生%s学号%d的成绩,其成绩如下\n",student[count2].name , student[count2].id );
int i=0;
for(;i<year; i++){
printf("第%d年 语文成绩为:%d 数学成绩为%d: 英语成绩为%d:\n", i, student[count2].yw[i], student[count2].sx[i], student[count2].yy[i]);
}
break;
}else {
count2++;
}
}
if(count2>count){
printf("未找到该学生%s成绩\n",student[count2].name);
}
}
void loginGrade( ){ //登记成绩
FILE *fp;
int yw;
int sx;
int yy;
printf("请输入需要成绩的登记学生学号:");
int id;
scanf("%d",&id);
int i=0;
int flag =0; //默认结构体里面无该学生
for(; i<MAX; i++){
if(strcmp(student[i].id), id){
printf("找到该学生!\n");
flag =1;
int i2=0;
for(; i2<year; i2++){
printf("请依次这位学生大学第%d年的 语文、数学、英语成绩(xx xx xx):",i2);
scanf("%d",&temp.yw[i2]);
scanf("%d",&temp.sx[i2]);
scanf("%d",&temp.yy[i2]);
cleanTemp();
fp = fopen("student.txt","r");
fwrite(&(temp),sizeof(struct Student),1,fp);
}
fclose(fp);
break;
}
}
if(flag==0){
printf("找不到该学生,请联系管理员添加学生!\n");
}
}
void removeStu(int id){ //删除学生
int i=0;
int flag=0; //默认结构体里面无改学生
for(; i<MAX; i++){
if( student[i].id == id){
printf("找到该学生%d!\n",student[i].id );
strcpy( student[i].id ,student[i+1].id );
strcpy( student[i].name ,student[i+1].name );
strcpy( student[i].yw ,student[i+1].yw );
strcpy( student[i].sx ,student[i+1].sx );
strcpy( student[i].yy ,student[i+1].yy );
int writeNum = getStuSumFromStruct()-1 ;
meakStructureToText(writeNum);
break;
}
if(i>=MAX){
printf("找不到该学生,删除失败!\n");
}
}
}
int main(){
meakTextToStruct();//往结构体写入文本
while(1){
printf("\n\n********************************************************************************************************\n");
printf("请选择登录模式 (输入1为学生模式登录) (输入2为教师模式登录)(输入3为管理员模式登录)(退出系统输入-1):");
int i ;
scanf("%d",&i);
if (i == 1){
printf(" 当前为<学生模式> 请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
int xxzh, xxmm;
scanf("%d",&xxzh);
scanf("%d",&xxmm);
if(( xxzh == 123) && (xxmm == 456) ){
printf("**登录成功,请选择模式**\n");
while(1){
printf("(输入1查询成绩)(输入-1退出学生模式):");
int xxMs;
scanf("%d",&xxMs);
switch (xxMs){
case 1:
findStudentGrade(); //调用 查询成绩方法
continue;
}
if( xxMs == -1 ){
break;
}else{
printf("当时输入有误,请重新输入!\n");
continue;
}
}
}
}
if (i == 2){
printf(" 当前为<教师模式> 请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
int jszh, jsmm;
scanf("%d",&jszh);
scanf("%d",&jsmm);
if(( jszh == 123) && (jsmm == 456) ){
printf("**登录成功,请选择模式**\n");
while(1){
printf("(输入1登记学生成绩)(输入2修改学生成绩)(输入-1退出教师模式):");
int jsMs;
scanf("%d",&jsMs);
switch (jsMs){
case 1:
loginGrade(); //登记成绩
continue;
case 2:
continue;
}
if(jsMs == -1){
break;
}else{
printf("当时输入有误,请重新输入!\n");
continue;
}
}
}
}
if (i == 3){
printf(" 当前为<管理员模式> 请分别输入账号和密码 (xxxx xxxx)中间用空格隔开: ");
int glyzh, glymm;
scanf("%d",&glyzh);
scanf("%d",&glymm);
if(( glyzh == 123) && (glymm == 456) ){
printf("**登录成功,请选择模式**\n");
while(1){
printf("(输入1查询学生成绩)(输入2修改学生成绩)(输入3增加学生)(输入4删除学生)( 输入-1退出管理员模式 ):");
int glyMs;
scanf("%d",&glyMs);
switch (glyMs){
case 1:
printf("请输入要查找学生的学号(学号) (xxx):");
continue;
case 2:
printf("请输入要修改学生和成绩(学号+成绩) 中间用空格隔开(xxx xxx):");
continue;
case 3:
addStudent();//添加学生
continue;
case 4:
printf("请输入要删除学生的学号(学号) (xxx):");
int id;
scanf("%d",&id);
removeStu(id);//删除学生方法
continue;
}
if(glyMs == -1){
break;
}else{
printf("当时输入有误,请重新输入!\n");
continue;
}
}
}
}
if(i == -1){
printf("\n你已退出系统,谢谢!");
break;
}
}
return 0;
}