【C-项目】学生信息管理系统

简介

系统:Ubuntu20.04
编译器:gcc





代码实现

简单分为4个部分

一、读取配置文件(账户文件、学生信息文件)

二、登录账户界面

三、功能选择界面(普通权限、管理员权限)

四、更新文件内容(退出时自动调用)





目录设计

  • conf目录(存放配置文件)
  • include目录(存放头文件)
  • src目录(存放源文件)

在这里插入图片描述





配置文件

根据需求自行调整

configure.txt文件(存放账户文件名、学生文件名)

usr_info.txt
stu_info.txt

stu_info.txt文件(0是女,1是男)

1001	Andy	0	66.00	67.00	68.00
1002	Tom		1	77.00	78.00	79.00
1003	Jobs	1	99.00	98.00	97.00
1004	Alis	0	89.00	90.00	88.00
1005	sun		1	77.00	78.00	76.00
1009	jun		0	56.00	57.00	58.00

usr_info.txt文件(数字表示权限,0:普通权限,1:管理员权限)

qin	111	0
ad	567	1
one	567	0




数据结构

学生信息和账户信息,均用链表结构存储,方便增删

学生信息节点

typedef struct Stu
{
    //数据域
    int _id;//学号
    char _name[30];//姓名
    char _gender;//性别
    float _score1;
    float _score2;
    float _score3;
    //指针域
    struct Stu *pNext;

}Stu_t, *pStu_t;

账户信息节点

typedef struct Usr
{
    //数据域
    char _name[30];//用户名
    char _pwd[30];//密码
    int _mode;//权限
    //指针域
    struct Usr *pNext;
}Usr_t, *pUsr_t;




主要功能

普通用户权限,只能查找学生信息

管理员权限,可以对学生或用户增删查改





以待改进

密码方面

  • 星号密码:输入密码时,可以用星号显示
  • 密文密码:存储密码时,不用明文存储,用密码+盐值生成一个密文

成绩有关

  • 根据总分,生成一张总分排名成绩表
  • 得出总分平均分、各科平均分
  • 得出各科最高分,各科最低分




启动程序

  1. src目录下编译:gcc *.c

  2. src目录下输入命令:./a.out ../conf/configure.txt (命令行参数是配置文件路径)

  3. 在登录界面输入账户名和密码,有3次机会,登录成功后显示主界面





界面显示

登录界面

在这里插入图片描述

普通用户界面

在这里插入图片描述

管理员界面

在这里插入图片描述





头文件 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

typedef struct Stu
{
    //数据域
    int _id;
    char _name[30];
    char _gender;
    float _score1;
    float _score2;
    float _score3;
    //指针域
    struct Stu *pNext;

}Stu_t, *pStu_t;

typedef struct Usr
{
    //数据域
    char _name[30];
    char _pwd[30];
    int _mode;//权限
    //指针域
    struct Usr *pNext;
}Usr_t, *pUsr_t;

//返回值检查
#define RET_CHECK(ret, num, msg)  if (num == ret) { fprintf(stderr, "%s\n", msg); return -1; } 

//主要功能
int init_datas(const char *conf, pUsr_t *ppUsrList, pStu_t *ppStuList);
int login(pUsr_t pUsrList);
void menu(pUsr_t* ppUsrList, pStu_t* ppStuList, int mode);
int update_allInfo(const char *conf, pUsr_t pUsrList, pStu_t pStuList);


#endif





主流程 main.c

#include "../include/head.h"
#include <stdio.h>

int main(int argc, char *argv[]) 
{
    //有一个命令行参数,配置文件
    if (2 != argc) {
        fprintf(stderr, "Argc error!\n");
        return -1;
    }
    
    //conf表示配置文件名
    const char *conf = argv[1];
    int ret;


    //初始化
    //加载账户和学生信息,用链表存储(便于增删查改)
    pUsr_t pUsrList = NULL;
    pStu_t pStuList = NULL;

    ret = init_datas(conf, &pUsrList, &pStuList);
    if (-1 == ret) {
        fprintf(stderr, "init failed!\n");
        return -1;
    }

    //登录
    //显示登录界面,并读取用户名和密码,有三次机会
    //输入密码时,用*号显示, 暂时没有实现
    //登录成功后,返回用户权限, 0代表普通权限,1代表管理员权限,-1表示登录失败
    int mode = login(pUsrList);
    if (-1 == mode) {
        fprintf(stderr, "login failed!\n");
        return -1;
    } 
    
    //选择
    //根据用户权限进入主界面,选择具体功能
    menu(&pUsrList, &pStuList, mode);

    //更新
    //将修改后的信息重新写入文件
    update_allInfo(conf, pUsrList, pStuList);
    return 0;
}





加载配置 init.c

步骤:

  1. 从conf配置文件中取出,账户文件名和学生文件名
  2. 将账户文件名转成路径,学生文件名转成路径
  3. 根据账户文件路径打开账户文件,加载账户信息生成一个账户链表
  4. 根据学生文件路径打开账户文件,加载学生信息生成一个学生链表

init.c

#include "../include/head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void init_usrlist(FILE *fusr, pUsr_t* ppUsrList);
void init_stulist(FILE *fstu, pStu_t* ppStuList);
void headInsertUsr(pUsr_t* ppUsrList, pUsr_t pTmp);
void sortInsertStu(pStu_t *ppStuList, pStu_t pTmp);
void displayUsr(pUsr_t pUsrList);
void displayStu(pStu_t ppStuList);

void sort_stulist(pStu_t *ppStuList);

int init_datas(const char *conf, pUsr_t *ppUsrList, pStu_t *ppStuList)
{
    //从配置文件中,拿到用户文件和学生信息文件
    FILE *fconfig = (FILE*)fopen(conf, "r");
    RET_CHECK(fconfig, NULL, "open conf error!");

    //为防止溢出,路径长度设大点
    char usrfile[30] = {0};
    char usrpath[128] = {0};
    char stufile[30] = {0};
    char stupath[128] = {0};
    fscanf(fconfig, "%s", usrfile);
    fscanf(fconfig, "%s", stufile);
    sprintf(usrpath, "../conf/%s", usrfile);
    sprintf(stupath, "../conf/%s", stufile);

    fclose(fconfig);

    //从用户文件中读取,初始化用户链表
    FILE *fusr = (FILE*)fopen(usrpath, "r+");
    RET_CHECK(fusr, NULL, "open fusr error!");
    init_usrlist(fusr, ppUsrList);
    fclose(fusr);

    /* displayUsr(*ppUsrList); */

    //从学生信息文件中读取,初始化学生链表
    FILE *fstu = (FILE*)fopen(stupath, "rb+");
    RET_CHECK(fstu, NULL, "open fstu error!");
    init_stulist(fstu, ppStuList);
    fclose(fstu);

    /* displayStu(*ppStuList); */

    return 0;
}

void init_usrlist(FILE *fusr, pUsr_t* ppUsrList)
{
    while (1) {
        Usr_t tmp;
        int ret = fscanf(fusr, "%s%s%d", tmp._name, tmp._pwd, &tmp._mode);
        if (EOF == ret) {
            break;
        }
        headInsertUsr(ppUsrList, &tmp);
    }

}

void headInsertUsr(pUsr_t *ppUsrList, pUsr_t pTmp)
{
    pUsr_t pNew = (pUsr_t)calloc(1, sizeof(Usr_t));
    memcpy(pNew, pTmp, sizeof(Usr_t));
    pNew->pNext = NULL;

    if (NULL == *ppUsrList) {
        //链表为空时
        *ppUsrList = pNew;
    }
    else {
        pNew->pNext = *ppUsrList;
        *ppUsrList = pNew;
    }
}

void init_stulist(FILE *fstu, pStu_t* ppStuList)
{
    while (1) {
        Stu_t tmp;
        int ret = fscanf(fstu, "%d%s %c%f%f%f", &tmp._id, tmp._name, &tmp._gender, &tmp._score1, &tmp._score2, &tmp._score3);
        if (EOF == ret) {
            return;
        }
        displayStu(*ppStuList);

        sortInsertStu(ppStuList, &tmp);
    }
}

void sortInsertStu(pStu_t *ppStuList, pStu_t pTmp)
{

    pStu_t pNew = (pStu_t)calloc(1, sizeof(Stu_t));
    memcpy(pNew, pTmp, sizeof(Stu_t));
    pNew->pNext = NULL;

    if (NULL == *ppStuList) {
        //链表为空时
        *ppStuList = pNew;
    }
    else if (pNew->_id < (*ppStuList)->_id) {
        pNew->pNext = *ppStuList;
        *ppStuList = pNew;
    }
    else {
        pStu_t pPre = *ppStuList;
        pStu_t pCur = pPre->pNext;

        for (; pCur; pPre = pCur, pCur = pCur->pNext) {
            if (pNew->_id < pCur->_id) {
                pPre->pNext = pNew;
                pNew->pNext = pCur;
                return;
            }
        }

        //新节点id最大
        if (NULL == pCur) {
            pPre->pNext = pNew;
        }
    }
}


void displayUsr(pUsr_t pUsrList)
{
    for (; pUsrList; pUsrList = pUsrList->pNext) {
        printf("usrname: %s, usrpwd = %s\n", pUsrList->_name, pUsrList->_pwd);
    }
}

void displayStu(pStu_t pStuList)
{
    for (; pStuList; pStuList = pStuList->pNext) {
        printf("id:%d\tname:%s\tgender:%s\ts1:%5.2f\ts2:%5.2f\ts3:%5.2f\n", 
               pStuList->_id,
               pStuList->_name,
               pStuList->_gender == '0' ? "女" : "男",
               pStuList->_score1,
               pStuList->_score2,
               pStuList->_score3);
    }
}




登录界面 login.c

#include "../include/head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

pUsr_t find_form_usrlist(pUsr_t pUsrList, pUsr_t tmp);

//返回用户权限, -1表示登录失败
int login(pUsr_t pUsrList)
{
    pUsr_t ret = NULL;

    //三次机会
    for (int i = 0; i < 3; ++i) {
        //待验证用户名,密码
        Usr_t tmp;
        memset(tmp._name, 0, sizeof(tmp._name));
        memset(tmp._pwd, 0, sizeof(tmp._pwd));
        tmp._mode = 0;

        system("clear");
        puts("--------------------Login in-------------------");
        printf("please input usrname: ");
        fscanf(stdin, "%s", tmp._name);
        printf("please input usrcode: ");
        //星号显示密码, 暂时做不到
        fscanf(stdin, "%s", tmp._pwd);

        //在用户链表中查找
        ret = find_form_usrlist(pUsrList, &tmp);    
        if (NULL == ret) {
            if (2 == i) {
                //三次都输入错误
                return -1;
            }
            system("clear");
            printf("please input again, incorrect username or password!\n");
            continue;
        }
        else {
            break;
        }
    }
    return ret == NULL ? -1 : ret->_mode;
}

pUsr_t find_form_usrlist(pUsr_t pUsrList, pUsr_t pTmp)
{
    //遍历链表,对比用户名和密码
    for (pUsr_t pCur = pUsrList; pCur; pCur = pCur->pNext) {
        if (!strcmp(pCur->_name, pTmp->_name) && !strcmp(pCur->_pwd, pTmp->_pwd)) {
            return pCur;
        }
    } 
    return NULL;
}




功能界面 menu.c

#include "../include/head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void menu_title();//界面头
void menu_0();//普通权限的菜单
void menu_1();//管理员权限的菜单
void stu_title();//学生信息头
void usr_title();//账户信息头
void my_pause();//按任意键继续

void show_stuInfo(pStu_t pCur);
void show_usrInfo(pUsr_t p);
int sort_insert_stu(pStu_t* ppStuList, pStu_t tmp);
int sort_insert_usr(pUsr_t* ppUsrList, pUsr_t tmp);

int func_findStu(pStu_t pStuList);
int func_addStu(pStu_t* ppStuList);
int func_updateStu(pStu_t pStuList);
int func_eraseStu(pStu_t* ppStuList);
void show_all_stu(pStu_t pStuList);

int func_findUsr(pUsr_t pUsrList);
int func_addUsr(pUsr_t* ppUsrList);
int func_updateUsr(pUsr_t pUsrList);
int func_eraseUsr(pUsr_t* ppUsrList);
void show_all_usr(pUsr_t pUsrList);


//根据用户权限,显示菜单界面
//账户的增删查改, 学生信息的增删查改
void menu(pUsr_t* ppUsrList, pStu_t* ppStuList, int mode)
{

    if (0 == mode) {
        //普通权限只能查找学生信息
        while (1) {
            //清空原有界面,显示新界面
            system("clear");
            menu_title();
            menu_0();
            //录入选择
            printf("select a number:");
            int option = -1;
            scanf("%d", &option);
            //0---退出  1---查找
            if (0 == option) {
                break;
            }
            else if (1 == option){
                func_findStu(*ppStuList);
                my_pause();
            }
            else if (2 == option) {
                system("clear");
                show_all_stu(*ppStuList);
                my_pause();
            }
            else {
                printf("选择无效,请重新选择!\n");
                my_pause();
                continue;
            }
        }
    }
    else if (1 == mode) {
        //管理员权限拥有全部功能
        while (1) {
            //清空原有界面,显示新界面
            system("clear");
            menu_title();
            menu_1();
            //录入选择
            printf("select a number:");
            int option = -1;
            scanf("%d", &option);
            //0---退出  
            //1-5  学生的查、增、删、改、显示全部
            //6-10 账户的查、增、删、改、显示全部
            if (0 == option) {
                break;
            }
            else if (1 == option){
                system("clear");
                func_findStu(*ppStuList);
                my_pause();
            }
            else if (2 == option) {
                system("clear");
                func_addStu(ppStuList);
                my_pause();
            }
            else if (3 == option) {
                system("clear");
                func_updateStu(*ppStuList);
                my_pause();
            }
            else if (4 == option) {
                system("clear");
                func_eraseStu(ppStuList);
                my_pause();
            }
            else if (5 == option) {
                system("clear");
                show_all_stu(*ppStuList);
                my_pause();
            }
            else if (6 == option) {
                system("clear");
                func_findUsr(*ppUsrList);
                my_pause();

            }
            else if (7 == option) {
                system("clear");
                func_addUsr(ppUsrList);
                my_pause();
            }
            else if (8 == option) {
                system("clear");
                func_updateUsr(*ppUsrList);
                my_pause();
            }
            else if (9 == option) {
                system("clear");
                func_eraseUsr(ppUsrList);
                my_pause();
            }
            else if (10 == option) {
                system("clear");
                show_all_usr(*ppUsrList);
                my_pause();
            }
            else {
                printf("选择无效,请重新选择!\n");
                my_pause();
                continue;
            }
        }
    }
}

int func_addStu(pStu_t* ppStuList)
{
    //输入一个学生的信息:id, name, gender, s1, s2, s3
    //判断id是否重复,如果重复报错返回,不重复则有序插入链表中
    Stu_t tmp;
    printf("please input new stu_id: ");
    scanf("%d", &tmp._id);

    for (pStu_t pCur = *ppStuList; pCur; pCur = pCur->pNext) {
        if (tmp._id == pCur->_id) {
            printf("this stu_id is already exist!\n");
            return -1;
        }
    }

    printf("please input new stu_name: ");
    scanf("%s", tmp._name);

    getchar();
    printf("please input new stu_gender(0-woman, 1-man): ");
    char c = 'a';
    scanf("%c", &c);
    if ('0' != c && '1' != c) {
        fprintf(stderr, "gender format error!\n");
        return -1;
    }
    tmp._gender = c;

    printf("please input new stu_score1: ");
    scanf("%f", &tmp._score1);
    printf("please input new stu_score2: ");
    scanf("%f", &tmp._score2);
    printf("please input new stu_score3: ");
    scanf("%f", &tmp._score3);

    sort_insert_stu(ppStuList, &tmp);
    printf("insert success!\n");
    return 0;
}

int sort_insert_stu(pStu_t* ppStuList, pStu_t tmp)
{
    pStu_t pNew = (pStu_t)calloc(1, sizeof(Stu_t));
    memcpy(pNew, tmp, sizeof(Stu_t));
    pNew->pNext = NULL;

    if (NULL == *ppStuList) {
        //链表为空
        *ppStuList = pNew;
    }
    else if (pNew->_id < (*ppStuList)->_id) {
        //新节点id最小
        pNew->pNext = *ppStuList;
        *ppStuList = pNew;
    }
    else if (NULL == (*ppStuList)->pNext) {
        //链表只有一个元素,且id小于新节点
        (*ppStuList)->pNext = pNew;
    }
    else {
        //链表至少有两个节点,且表头id小于新节点
        //找到一个pCur节点id大于新节点,将新节点插入pPre后
        //如果没找到,插入最后
        pStu_t pPre = *ppStuList;
        pStu_t pCur = pPre->pNext;

        for (; pCur; pPre = pCur, pCur = pCur->pNext) {
            if (pCur->_id > pNew->_id) {
                pPre->pNext = pNew;
                pNew->pNext = pCur;
                break;
            }
        }

        if (NULL == pCur) {
            pPre->pNext = pNew;
        }
    }

    return 0;
}


int func_eraseStu(pStu_t* ppStuList)
{
    //如果空,显示空退出
    //得到删除stu_id,查找若存在删除,若不存在提示退出
    //删表头时,更新表头
    if (NULL == *ppStuList) {
        fprintf(stderr, "Empty!\n");
        return -1;
    }

    int id;
    printf("please input delete stu_id: ");
    scanf("%d", &id);

    pStu_t pCur = *ppStuList;
    if (id == (*ppStuList)->_id) {
        *ppStuList = pCur->pNext;  
    }
    else {
        pStu_t pPre = pCur;
        pCur = pCur->pNext;  
        for (; pCur; pPre = pCur, pCur = pCur->pNext) {
            if (id == pCur->_id) {
                pPre->pNext = pCur->pNext;
                break;
            }
        }
    }

    if (NULL == pCur) {
        fprintf(stderr, "Not found the stu_id!\n");
        return -1;
    }
    else {
        printf("Delete success!\n");
        free(pCur);
        pCur = NULL;
        return 0;
    }
}

int func_updateStu(pStu_t pStuList)
{
    //输入待修改的stu_id, 若存在则输入修改信息
    printf("please input modify stu_id: ");
    int id;
    scanf("%d", &id);

    pStu_t pCur = NULL;
    for (pCur = pStuList; pCur; pCur = pCur->pNext) {
        if (id == pCur->_id) {
            puts("1-modify stu_name");
            puts("2-modify stu_gender");
            puts("3-modify stu_score1");
            puts("4-modify stu_score2");
            puts("5-modify stu_score3");
            puts("6-modify all");

            int option;
            scanf("%d", &option);

            switch (option) {
            case 1:
                printf("modify stu_name: ");
                scanf("%s", pCur->_name);
                break;
            case 2:
                printf("modify stu_gender(0-woman 1-man): ");
                scanf("%c", &pCur->_gender);
                break;
            case 3:
                printf("modify stu_score1: ");
                scanf("%f", &pCur->_score1);
                break;
            case 4:
                printf("modify stu_score2: ");
                scanf("%f", &pCur->_score2);
                break;
            case 5:
                printf("modify stu_score3: ");
                scanf("%f", &pCur->_score3);
                break;
            case 6:
                printf("modify name-gender-score1-score2-score3: ");
                scanf("%s %c%f%f%f", pCur->_name, &pCur->_gender, &pCur->_score1, &pCur->_score2, &pCur->_score3);
                break;
            default:
                printf("input error\n");
                break;
            }

            printf("Update success!\n");
            return 0;
        }
    }

    printf("Not found!\n");
    return -1;
}

int func_addUsr(pUsr_t* ppUsrList)
{
    //输入一个用户的信息:name, pwd, mode
    //判断name是否重复,如果重复报错返回,不重复则插入链表中
    Usr_t tmp;
    memset(&tmp, 0, sizeof(tmp));
    
    //录入用户名
    printf("please new usr_name: ");
    scanf("%s", tmp._name);

    for (pUsr_t pCur = *ppUsrList; pCur; pCur = pCur->pNext) {
        if (!strcmp(tmp._name, pCur->_name)) {
            fprintf(stderr, "usr_name is already exist, cannot insert !\n");
            return -1;
        }
    }

    //录入用户密码
    char pwd[30] = {0};
    printf("please input usr_pwd: ");
    scanf("%s", pwd);
    printf("please input usr_pwd again: ");
    scanf("%s", tmp._pwd);

    if (strcmp(pwd, tmp._pwd)) {
        fprintf(stderr, "usr_pwd comparison failed!\n");
        return -1;
    }

    //录入用户权限
    printf("please input usr_mode(0-normal 1-root): ");
    scanf("%d", &tmp._mode);
    if (0 != tmp._mode && 1 != tmp._mode) {
        fprintf(stderr, "usr_mode format error!\n");
        return -1;
    }

    //添加用户
    pUsr_t pNew = (pUsr_t)calloc(1, sizeof(Usr_t));
    memcpy(pNew, &tmp, sizeof(Usr_t));
    pNew->pNext = *ppUsrList;
    *ppUsrList = pNew;
    printf("Add success!\n");
    return 0;
}

int func_eraseUsr(pUsr_t* ppUsrList)
{
    //输入用户名,找到删除
    printf("please input usr_name: ");
    char name[30] = {0};
    scanf("%s", name);

    pUsr_t pCur = *ppUsrList;
    if (!strcmp(name, pCur->_name)) {
        *ppUsrList = pCur->pNext;
    }
    else {
        pUsr_t pPre = pCur;
        pCur = pCur->pNext;

        for (; pCur; pPre = pCur, pCur = pCur->pNext) {
            if (!strcmp(name, pCur->_name)) {
                pPre->pNext = pCur->pNext;
                break;
            }
        }
    }

    if (NULL == pCur) {
        fprintf(stderr, "Not found the usr_name!\n");
        return -1;
    }
    else {
        printf("Delete success!\n");
        free(pCur);
        pCur = NULL;
        return 0;
    }
}

int func_updateUsr(pUsr_t pUsrList)
{
    //输入待修改的usr_name, 若存在则输入修改信息
    printf("please input modify usr_name: ");
    char name[30] = {0};
    scanf("%s", name);

    pUsr_t pCur = NULL;
    for (pCur = pUsrList; pCur; pCur = pCur->pNext) {
        if (!strcmp(name, pCur->_name)) {
            puts("1-modify usr_pwd");
            puts("2-modify usr_mode");

            int option;
            printf("select : ");
            scanf("%d", &option);

            if (1 == option) {
                char tmp[30] = {0};
                char tmp2[30] = {0};
                printf("input usr_pwd: ");
                scanf("%s", tmp);
                printf("input usr_pwd again: ");
                scanf("%s", tmp2);

                if (!strcmp(tmp, tmp2)) {
                    strcpy(pCur->_pwd, tmp);
                }
                else {
                    printf("input error!\n");
                    return -1;
                }
            }
            else if (2 == option) {
                printf("modify usr_mode: ");
                scanf("%d", &pCur->_mode);
            }
            else {
                printf("option error\n");
                return -1;
            }

            printf("Update success!\n");
            return 0;
        }
    }

    printf("Not found!\n");
    return -1;
}

void show_all_stu(pStu_t pStuList)
{
    stu_title();
    for (pStu_t pCur = pStuList; pCur; pCur = pCur->pNext) {
        show_stuInfo(pCur);
    }
}

void show_all_usr(pUsr_t pUsrList)
{
    usr_title();
    for (pUsr_t pCur = pUsrList; pCur; pCur = pCur->pNext) {
        show_usrInfo(pCur);
    }
}

void my_pause()
{
    printf("按任意键继续...\n");
    getchar();
    getchar();
}

int func_findStu(pStu_t pStuList)
{
    int id;
    printf("please input std_id: ");
    scanf("%d", &id);
    
    for (pStu_t pCur = pStuList; pCur; pCur = pCur->pNext) {
        if (id == pCur->_id) {
            system("clear");
            stu_title();
            show_stuInfo(pCur);
            return 0;
        }
    }

    puts("Not found!");
    return -1;
}

int func_findUsr(pUsr_t pUsrList)
{
    char name[30] = {0};
    printf("please input usr_name: ");
    scanf("%s", name);

    for (pUsr_t pCur = pUsrList; pCur; pCur = pCur->pNext) {
        if (!strcmp(name, pCur->_name)) {
            system("clear");
            usr_title();
            show_usrInfo(pCur);
            return 0;
        }     
    }

    puts("Not found!");
    return -1;
}

void show_stuInfo(pStu_t p)
{
    if (p) {
        printf("%d\t%-s\t%-s\t%-5.2f\t%-5.2f\t%-5.2f\n", 
               p->_id, 
               p->_name, 
               p->_gender == '0' ? "女" : "男",
               p->_score1, 
               p->_score2, 
               p->_score3);
    }
}

void show_usrInfo(pUsr_t p) 
{
    if (p) {
        printf("%s\t%s\t%d\n", p->_name, p->_pwd, p->_mode);
    }
}

void stu_title()
{
    puts("ID\tNAME\tGENDER\tSCORE1\tSCORE2\tSCORE3");
}

void usr_title()
{
    puts("NAME\tPWD\tMODE");
}

void menu_0()
{
    puts("              0. exit");
    puts("              1. seach student information by id");
    puts("              2. show all_stu_info");
}

void menu_title()
{
    puts("===============================================================================");
    puts("=             Student    Information    Management    System                  =");
    puts("===============================================================================");
    puts("");
}

void menu_1()
{
    puts("              0. exit");
    puts("");
    puts("              Student Information Func");
    puts("              1. search by id");
    puts("              2. add ");
    puts("              3. update");
    puts("              4. delete ");
    puts("              5. show all");
    puts("");
    puts("              Usr Account Func");
    puts("              6. search by name");
    puts("              7. add ");
    puts("              8. update");
    puts("              9. delete ");
    puts("              10.show all");
    puts("");
}





更新信息 update.c

根据链表重写文件

#include "../include/head.h"
#include <stdio.h>

int update_allInfo(const char *conf, pUsr_t pUsrList, pStu_t pStuList)
{
    //以w模式打开用户文件和学生信息文件
    //将用户链表和学生链表重新写入
    
    //从配置文件中,拿到用户文件和学生信息文件
    FILE *fconfig = (FILE*)fopen(conf, "r");
    RET_CHECK(fconfig, NULL, "open conf error!");

    //为防止溢出,路径长度设大点
    char usrfile[30] = {0};
    char usrpath[128] = {0};
    char stufile[30] = {0};
    char stupath[128] = {0};
    fscanf(fconfig, "%s", usrfile);
    fscanf(fconfig, "%s", stufile);
    sprintf(usrpath, "../conf/%s", usrfile);
    sprintf(stupath, "../conf/%s", stufile);

    fclose(fconfig);

    //将用户链表写入用户文件
    FILE *fusr = (FILE*)fopen(usrpath, "w");
    RET_CHECK(fusr, NULL, "open fusr error!");

    for (pUsr_t pCur = pUsrList; pCur; pCur = pCur->pNext) {
        fprintf(fusr, "%s\t%s\t%d\n", pCur->_name, pCur->_pwd, pCur->_mode);
    }

    fclose(fusr);

    //将学生链表,写入学生信息文件
    FILE *fstu = (FILE*)fopen(stupath, "w");
    RET_CHECK(fstu, NULL, "open fstu error!");

    for (pStu_t pCur = pStuList; pCur; pCur = pCur->pNext) {
        fprintf(fstu, "%d\t%s\t%c\t%5.2f\t%5.2f\t%5.2f\n", pCur->_id, pCur->_name, pCur->_gender, 
                pCur->_score1, pCur->_score2, pCur->_score3);
    }

    fclose(fstu);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值