简介
系统: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;
主要功能
普通用户权限,只能查找学生信息
管理员权限,可以对学生或用户增删查改
以待改进
密码方面
- 星号密码:输入密码时,可以用星号显示
- 密文密码:存储密码时,不用明文存储,用密码+盐值生成一个密文
成绩有关
- 根据总分,生成一张总分排名成绩表
- 得出总分平均分、各科平均分
- 得出各科最高分,各科最低分
启动程序
-
在
src
目录下编译:gcc *.c
-
在
src
目录下输入命令:./a.out ../conf/configure.txt
(命令行参数是配置文件路径) -
在登录界面输入账户名和密码,有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
步骤:
- 从conf配置文件中取出,账户文件名和学生文件名
- 将账户文件名转成路径,学生文件名转成路径
- 根据账户文件路径打开账户文件,加载账户信息生成一个账户链表
- 根据学生文件路径打开账户文件,加载学生信息生成一个学生链表
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;
}