为什么当我调用addStudent()后,学生数据没有成功写入
#include <stdio.h>
#include <stdlib.h>
#define year 4 //定义大学年份为4年
#define MAX 10 //定义最大值
int getStuSumFromStruct(); //获取学生个数
void cleanTemp(); //格式化temp
void meakTextToStruct(); //更新结构体数组
void meakStructureToText(int writeNum ); //更新文本文本
void addStudent(); //添加学生
void findStudentGrade(); //查询成绩
void loginGrade( ); //登记成绩
void removeStu(int id); //删除学生
void showStuFromStudent(); //展示全部学生
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;
int count;
for(;i<MAX; i++){
if( student[i].id==0 ){
count++;
}
}
return i;
}
void cleanTemp(){ //格式化temp
temp.name[0] = '\0';
temp.id = '\0';
temp.yw[0] = '\0';
temp.sx[0] = '\0';
temp.yy[0] = '\0';
// printf("格式化temp成功,当前temp内容为:\n");
// int i=0;
// printf("学号%d姓名%s \n",temp.id,temp.name);
// for(;i<year; i++){
// printf("temp: 第%d年 语文成绩为:%d 数学成绩为%d: 英语成绩为%d:\n", i+1, temp.yw[i], temp.sx[i], temp.yy[i]);
// }
}
void cleanStudent(){ //格式化student
int i=0;
for(;i<MAX;i++){
student[i].name[0] = '\0';
student[i].id = '\0';
int j1=0;
for(;j1<year;j1++){
student[i].yw[j1] = '\0';
student[i].sx[j1] = '\0';
student[i].yy[j1] = '\0';
}
printf("**********************清除student[%d]*******************\n",i);
printf(" name:%s\n",student[i].name);
printf(" id :%d\n",student[i].id);
int j2=0;
for(;j2<year;j2++){
printf("yw :%d\n",student[i].yw[j2]);
printf("sx :%d\n",student[i].sx[j2]);
printf("yy :%d\n",student[i].yy[j2]);
}
}
printf(" 格式化学生成功!\n");
meakStructureToText(MAX);
showStuFromStudent();
}
void meakTextToStruct(){ //更新结构体数组
FILE *fp;
fp = fopen("student.txt","r");
if(fp == NULL){
printf("学生成绩数据文件丢失,即将退出系统!\n");
Sleep(3000);
exit(0);
}
int r;
int i=0; //记录读取到学生的个数
int flag=0;
printf("\n\n格式化学生\n");
cleanStudent();//在更新结构体前先格式化学生
printf("\n格式化学生\n\n");
r = fread(&student[i],sizeof(struct Student),1,fp); //文本内容 导入 结构体student里面
while(r){
printf("读取第%d次\n",i);
flag=1;
i++;
r = fread(&student[i],sizeof(struct Student),1,fp);
}
if(flag){
printf("更新结构体数组成功!(已从文本导入内容)\n");
}else{
printf("文本无学生数据!(文本导入内容失败)请从管理员模式导入学生!\n");
}
fclose(fp);
}
void meakStructureToText(int writeStuCount ){ //更新文本文本
FILE *fp = fopen("student.txt","wb"); //写入文本 并且把原来文本的内容清除
int count=0;
while(count<=writeStuCount){
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( strcmp(student[i].id ,id)==0 ){
printf("该学号 %d 已被录入!\n",student[i]);
flag=1;
break;
}
}
if(flag==0){
FILE *fp ;
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(student),1,fp);//temp添加到text
fclose(fp);
printf("姓名:%s 学号:%d 写入text成功\n",temp.name ,temp.id);
// showTemp();
// meakTextToStruct();//更新结构体
// printf("\n\n显示结构体\n");
// showStuFromStudent();
// printf("\n显示结构体\n\n");
}
}
void findStudentGrade(){ //查询成绩
int count = getStuSumFromStruct(); //并且获取数组有效学生个数
meakTextToStruct(); //更新结构体数组
int id;
int count2=0; //记录在结构体查找学生的次数
printf("请输入学号:");
scanf("%d",&id);
for(;count2<=count;count2++){
if( student[count2].id == id ){
printf("已找到学生%s学号%d的成绩,其成绩如下\n",student[count2].name , student[count2].id );
int i=0;
for(;i<year; i++){
printf("(count2为 %d)第%d年 语文成绩为:%d 数学成绩为%d: 英语成绩为%d:\n", count2,i+1, student[count2].yw[i], student[count2].sx[i], student[count2].yy[i]);
}
break;
}
}
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++){
printf("ID%d",student[i].id);
if( strcmp(student[i].id , id)==0 ){
printf("找到该学生!姓名:%s 学号:%d \n",student[i].name,student[i].id);
flag =1;
int i2=0;
cleanTemp();//格式化temp
for(; i2<year; i2++){
printf("请依次这位学生大学第%d年的 语文、数学、英语成绩(xx xx xx):",i2+1);
scanf("%d",&temp.yw[i2]);
scanf("%d",&temp.sx[i2]);
scanf("%d",&temp.yy[i2]);
}
temp.id = student[i].id;
strcpy( temp.name , student[i].name );
// int willRemove=student[i].id;
// removeStu(willRemove);
fp = fopen("student.txt","ab");
fwrite(&(temp),sizeof(struct Student),1,fp);//把temp写入文本
fclose(fp);
meakTextToStruct();//更新结构体
showStuFromStudent();//显示学生数据
break;
}
}
if(flag==0){
printf("找不到该学生,请联系管理员添加学生!\n");
}
}
void removeStu(int id){ //删除学生
int i=0;
int flag=0; //默认结构体里面无该学生
int writeStuCount = 0;//默认写入学生数为0
for(; i<MAX; i++){
if( student[i].id == id){
printf("找到该学生%s.%d!\n",student[i].name,student[i].id );
if(i==0){
cleanStudent();
}else{
student[i].id = student[i+1].id ;
strcpy( student[i].name ,student[i+1].name );
int j=0;
for(;j<year;j++){
strcpy( student[i].yw[j] ,student[i+1].yw[j] );
strcpy( student[i].sx[j] ,student[i+1].sx[j] );
strcpy( student[i].yy[j] ,student[i+1].yy[j] );
}
int writeStuCount = getStuSumFromStruct()-1 ;
}
meakStructureToText(writeStuCount);
meakTextToStruct();
printf("删除学生成功!\n");
showStuFromStudent();
break;
}
if(i>=MAX){
printf("找不到该学生,删除失败!\n");
}
}
}
void showStuFromStudent(){ //展示全部学生
int i=0;
int j=0;
for(;i<MAX;i++){
printf("----------");
printf(" 姓名:%s 学号:%d 成绩如下\n",student[i].name,student[i].id);
for(;j<year; j++){
printf("第%d年 语文成绩为:%d 数学成绩为:%d 英语成绩为:%d\n",j+1, student[i].yw[j], student[i].sx[j], student[i].yy[j]);
}
}
}
void showTemp(){
int j=0;
printf("----------");
printf("temp: 姓名:%s 学号:%d 成绩如下\n",temp.name,temp.id);
for(;j<year; j++){
printf("第%d年 语文成绩为:%d 数学成绩为:%d 英语成绩为:%d\n",j+1,temp.yw[j], temp.sx[j],temp.yy[j]);
}
}
int main(){
meakTextToStruct();//更新结构体
showStuFromStudent();
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:
findStudentGrade();
continue;
case 2:
cleanStudent();
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;
}