用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;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值