Bootstrap

c语言结构体增删改查,将结构体写入和读取txt文本

#include <stdio.h>
#include <stdlib.h>
#define max 10 //定义最大可存储最多学生数
#define year 4 //定义大学为4年
struct Student {
    char name[10];
    int id;
    int yw[year];
    int sx[year];
    int yy[year];
} student[max];//建立一个学生结构体数组


/*
    下面分别 读取和写入
*/
void textToStu(){  //读取text去结构数组
    //1.读取text文件
    FILE *fp = fopen("student.txt", "r");
    if(NULL == fp) { //确保成功打开文件,否则退出系统
        printf("数据获取失败!即将退出系统...\n");
        Sleep(1000);
        printf("3\n");
        Sleep(1000);
        printf("2\n");
        Sleep(1000);
        printf("1\n");
        exit(0);
    }else{
        printf("数据读取成功!即将进入系统...\n");
        Sleep(1000);
        printf("3\n");
        Sleep(1000);
        printf("2\n");
        Sleep(1000);
        printf("1\n");
    }

    //2 读取问text文件内容并存到结构体容器中
    int num = 0;
    int r;
    r = fread(&student[num], sizeof(struct Student),1, fp);
    while(r) {
        num++;
        r = fread(&student[num], sizeof(struct Student),1, fp);
    }
    //3 关闭文件
    fclose(fp);
}
void stuToText(){   //读取结构数组去text
    FILE *fp = fopen("student.txt", "w");
    //从嫁给他数组容器写入数据到text
    int count = 0;
    int sum=getStuSum();
    while(count < sum) {
        fwrite(&student[count],  sizeof(struct Student),1, fp);
        count++;
    }
    printf("\n\n\n数据写入成功!即将退出系统!\n");
    Sleep(1000);
    printf("3\n");
    Sleep(1000);
    printf("2\n");
    Sleep(1000);
    printf("1\n");
    fclose(fp);
}


/*
    从数组获取学生个数     格式化学生数组某一个位置上面的内容
*/
int getStuSum(){ //获取学生个数
    int i=0,j=0;
    for(;i<max;i++){
        if( student[i].id==0 ){
            j++;
        }
    }
    printf("<<<<<< 当前学生个数为:%d >>>>>>\n",max-j);
    return max-j;
}
void removeIdStu(int i){  //移除数组下标为i的学生
    student[i].name[0] = '\0';
    student[i].id   = 0 ;
    int j=0;
    for(;j<year;j++){
        student[i].yw[j]   = '\0' ;
        student[i].sx[j]   = '\0' ;
        student[i].yy[j]   = '\0' ;
    }
    printf("************* 删除成功 ***********\n");
}

/*
    下面为对学生数组进行操作的方法
*/


void addStu() {  //增加学生
    char name[10];
    int id;
    printf("\t请输入要添加的学生学号:");
    scanf("%d", &id);
    printf("\t请输入要添加的学生名字:");
    scanf("%s", name);
    int i=0;
    printf("<<<<<< 即将准备添加学生时");
    int sum=getStuSum();
    for(;i<=sum;i++){
        if( id  ==student[i].id )  { printf("******* 录入失败!该学生的学号已被录入!*******\n");break; }
        if( strcmp(name , student[i].name )==0 ){ printf("******* 录入失败!该学生的姓名已被录入!*******\n"); break;}
        if( i == sum ){
            student[i].id = id;
            strcpy( student[i].name , name);
            printf("*-*-*-* 学号:%d 姓名:%s  信息录入成功!*-*-*-*\n",student[i].id , student[i].name);
        }
    }

}

void researchStu() { //查询某位学生成绩
    int id; //接收用户输入的学号
    int count=0 ;
    int  sum = getStuSum();
    printf("\t 请输入要查询成绩的学号:");
    scanf("%d", &id);
    while(count <= sum) {

        if( student[count].id == id){
            printf("\t学号:%d   名字:%s  \n",  student[count].id ,student[count].name );
            printf("[ ][ ][ ]  该学生成绩如下  [ ][ ][ ]\n");
            int j=0;
            for(;j<year;j++){
                printf("- - - - -第%d年     语文:%d  数学:%d  英语:%d  \n" ,j+1, student[count].yw[j], student[count].sx[j], student[count].yy[j] );
            }
            break;
        }
        else {
            count++;
        }
    }
    if(count > sum) {
        printf("******* 未找到该学生!*******\n");
    }
}

void showAllStu() { //查看全部 学生信息
    int count = 0;
    int sum = getStuSum();
    while(count < sum) {
        printf("\t学号:%d   名字:%s  \n",  student[count].id ,student[count].name );
        int j=0;
        for(;j<year;j++){
            printf("- - - - -第%d年     语文:%d  数学:%d  英语:%d  \n",j+1, student[count].yw[j], student[count].sx[j], student[count].yy[j] );
        }
        count++;

    }
    if(count==0){
        printf("****** 无法获取全部学生,当前无学生!******\n");
    }
}

void loginStuGrade(int gradeMs){  //0登记成绩 或者 1修改某位学生的成绩
    if(gradeMs){
        printf("\t 请输入需要修改成绩的学生学号:");
    }
    else{
        printf("\t 请输入需要登记成绩的学生学号:");
    }
    int flag;
    int id; //接收输入的学号
    scanf("%d", &id);
    int count = 0;
    int sum=getStuSum();
    while(count < sum) {
        if( student[count].id == id ){
            int k=0;
            for(;k<year;k++){   //在修改成绩模式中,如果某一年全部成绩数据为零,则flag标记加一,当标记flag加到2以上时,就判断改学生成绩数据为空,则,当调用修改成绩方法时,当大部分成绩数据数据为零,则无法修改成绩
                if( (student[count].yw[k] ==0)&&(student[count].sx[k]==0)&&(student[count].yy[k]==0 )   ){ flag++;}
            }
            if( (flag>=3)&&(gradeMs==1) ){//在修改成绩模式中  当flag大于等于2时,证明学生成绩大部分为空,则无法修改成绩
                printf("****** 当前学生成绩 大部分or全部 均为空,无法修改成绩,请从教师模式登记录入成绩 ******\n");
                break;
            }

            int j=0;
            for(;j<year;j++){
                printf("\t 请输入第%d年成绩 (语文 数学 英语)(xx xx xx):",j+1);
                int yw=0 ,sx=0 ,yy=0;
                scanf("%d", &yw);
                scanf("%d", &sx);
                scanf("%d", &yy);
                student[count].yw[j] =  yw;
                student[count].sx[j] =  sx;
                student[count].yy[j] =  yy;
            }
            printf("** *<!<!<! 登记成功 !>!>!>* ** \n");
            break;
        }
        count++;
    }
    if(count >= sum) {
        printf("******* 未找到该学生!*******\n");
    }
}

void deleteStu() { //删除学生
    int id;
    int count=0;
    int sum=getStuSum();
    printf("\t 请输入想要删除的学生的学号:");
    scanf("%d", &id);
    while(count < sum) {
        if( student[count].id == id  ) {
            printf("***找到学生%s 准备执行该学生删除!***\n",student[count].name);
            for(; count < sum; count++) {
                strcpy(student[count].name, student[count + 1].name );
                student[count].id = student[count + 1].id;
                int j=0;
                for(;j<year;j++){
                    student[count].yw[j] = student[count + 1].yw[j];
                    student[count].sx[j] = student[count + 1].sx[j];
                    student[count].yy[j] = student[count + 1].yy[j];
                }
            }
            printf("******* 删除成功!*******\n");
            break;
        } else {
            count++;
        }
    }
    removeIdStu( sum-1 );//移除最后一位学生
    if(count >= sum) {
        printf("******* 未找到该学生信息!*******\n");
    }
}

//int main()
//{
//    textToStu();  //读取text去结构数组
//    int i;
//    while(1){
//        printf("\n");
//        printf("\t 请输入模式:");
//        scanf("%d",&i);
//        switch (i){
//            case 1:
//                addStu();   //添加 一个学生姓名
//                continue;
//            case 2:
//                researchStu(); //查询某位学生成绩
//                continue;
//            case 3:
//                showAllStu();//查看全部学生内容
//                continue;
//            case 4:
//                int what;
//                scanf("%d",&what);
//                loginStuGrade(what);//登记成绩 或者 修改某位学生的成绩
//                continue;
//            case 5:
//                deleteStu(); //删除某个学生
//                continue;
//            case 6:
//                getStuSum();//获取学生个数
//                continue;
//        }
//        if( i==(-1) ) {
//                break;
//        }
//    }
//    stuToText();  //读取结构数组去text
//}


int main(){
    textToStu();  //读取text去结构数组
    while(1){
        printf("\n\n\n\n********************************************************************************************************\n");
        printf("  \t \t  《《《《《<<<<<  请选择登录模式  >>>>>》》》》》\n (输入1为学生模式登录) (输入2为教师模式登录)(输入3为管理员模式登录)(退出系统输入-1):");
        int i ;//登录模式
        int zh, mm;//账号密码
        int ms;//内部模式
        int gradeMs;
        scanf("%d",&i);
        if (i == 1){
            printf("\n  \t \t\t   当前为 <学生模式> \n \t\t   请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
            scanf("%d",&zh);
            scanf("%d",&mm);
            if(( zh == 123) && ( mm == 456) ){
                printf("\t\t~~~~~~~ 登录成功,请选择模式 ~~~~~~~\n");
                while(1){
                    printf("\n\n\n");
                    printf("\t(输入1查询成绩)(输入-1退出学生模式):");
                    scanf("%d",&ms);
                    switch (ms){
                        case 1:
                        researchStu(); //查询某位学生成绩
                        continue;
                    }
                    if( ms == -1 ){
                        break;
                    }else{
                        printf("*******当时输入有误,请重新输入!*******\n");
                        continue;
                    }
                }
            }else{
                printf("******************  当前输入的账号或密码有误! ******************");
            }
        }
        if (i == 2){
            printf("\n  \t \t\t   当前为 <教师模式> \n \t\t请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
            scanf("%d",&zh);
            scanf("%d",&mm);
            if(( zh == 123) && (mm == 456) ){
                printf("\t\t*******登录成功,请选择模式*********\n");
                while(1){
                    printf("\n\n\n");
                    printf("\t(输入1登记学生成绩)(输入2修改学生成绩)(输入-1退出教师模式):");
                    scanf("%d",&ms);
                    switch (ms){
                        case 1:
                            gradeMs=0;//0为登记学生成绩
                            loginStuGrade(gradeMs);//登记成绩 或者 修改某位学生的成绩
                            continue;
                        case 2:
                            gradeMs=1;//1为修改学生成绩
                            loginStuGrade(gradeMs);//登记成绩 或者 修改某位学生的成绩
                            continue;
                    }
                    if(ms == -1){
                        break;
                    }else{
                        printf("**********当时输入有误,请重新输入!***********\n");
                        continue;
                    }
                }
            }else{
                printf("******************  当前输入的账号或密码有误! ******************");
            }
        }
        if (i == 3){
            printf("\n  \t \t\t   当前为 <管理员模式> \n \t\t请分别输入账号和密码 (xxx xxx)中间用空格隔开: ");
            scanf("%d",&zh);
            scanf("%d",&mm);
            if( ( zh == 123) && (mm == 456) ){
                printf("\t\t******登录成功,请选择模式*******\n");
                while(1){
                    printf("\n\n\n");
                    printf("(输入1查询学生成绩)(输入2修改学生成绩)(输入3增加学生)(输入4删除学生)(输入5查看全部学生)(输入6查看学生总数)( 输入-1退出管理员模式 ):");
                    scanf("%d",&ms);
                    switch (ms){
                        case 1:
                            researchStu(); //查询某位学生成绩
                            continue;
                        case 2:
                            gradeMs=1;
                            loginStuGrade(gradeMs);//0登记成绩 或者 1修改某位学生的成绩
                            continue;
                        case 3:
                            addStu();//添加学生
                            continue;
                        case 4:
                            deleteStu(); //删除某个学生
                            continue;
                        case 5:
                            showAllStu();//查看全部学生内容
                            continue;
                        case 6:
                            getStuSum();//获取学生个数
                            continue;
                    }
                    if(ms == -1){
                        break;
                    }else{
                        printf("*********当时输入有误,请重新输入!**********\n");
                        continue;
                    }
                }
            }else{
                printf("******************  当前输入的账号或密码有误! ******************");
            }
        }
        if(i == -1){
            printf("\n****你已退出系统,谢谢!*****");
                break;
        }
    }

    stuToText();  //读取结构数组去text
    return 0;
}


 

;