关于文件的操作,这篇文章写的非常好,极力推荐!!!
https://blog.csdn.net/m0_46671092/article/details/107498443?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163993891316780265425605%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163993891316780265425605&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-107498443.first_rank_v2_pc_rank_v29&utm_term=c%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C&spm=1018.2226.3001.4187
废话不多说,直接上代码。
//学生成绩管理系统加文件操作!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
// 描述学生信息的结构体
struct student
{
char name[18]; // 名字
int num; // 学号
double score[3]; // 3门课的成绩
double sum; // 总分
};
// 学生所有信息的结构体
struct stuSystem
{
struct student stu[MAX]; //系统用学生的信息的结构体数组stu[]来储存学生的信息
int curSize; //当前系统中有的学生数
};
// 创建系统的函数
struct stuSystem* createSystem()
{
//初始化结构体指针
struct stuSystem* pSystem = (struct stuSystem*)calloc(sizeof(struct stuSystem), 1);
return pSystem;
};
// 制作菜单
void makeMenu()
{
printf("---------------------------------------------\n");
printf("\t\t 0. 退出系统 \n");
printf("\t\t 1. 录入信息 \n");
printf("\t\t 2. 浏览信息 \n");
printf("\t\t 3. 删除信息 \n");
printf("\t\t 4. 修改信息 \n");
printf("\t\t 5. 查找信息 \n");
printf("\t\t 6. 排序信息 \n");
printf("---------------------------------------------\n");
printf("---------请输入(0 ~ 7):");
}
// 录入学生信息的函数
void inputStu(struct stuSystem* pSystem)
{
struct student temp; // 结构体变量,临时储存用户输入的信息
printf("请输入学生的姓名和学号:");
scanf("%s%d",temp.name, &temp.num);
printf("请输入此学生3门课的成绩:");
temp.sum = 0;
for(int i = 0; i < 3; i++)
{
scanf("%lf",&temp.score[i]);
temp.sum += temp.score[i];
}
insertArray(pSystem, temp); // 插入数组函数(用于将用户输入的信息插入并储存在数组中)
}
// 插入(学生信息)数组函数
void insertArray(struct stuSystem* pSystem,struct student stuInfo)
{
if(pSystem -> curSize >= MAX) // 如果数组已经存满
{
printf("学生人数已满,无法录入!\n");
return; // 直接返回
}
// 若没有存满
pSystem ->stu[pSystem ->curSize] = stuInfo; // 指针指向学生信息的数组并赋值
pSystem ->curSize++; // 指向现在已经存在学生数
}
//打印(学生信息)数组函数
void printfArray(struct stuSystem* pSystem)
{
printf("姓名\t编号\t数学\t英语\t体育\t总分\n");
for(int i = 0; i < pSystem ->curSize; i++)
{
printf("%s\t%d\t",pSystem ->stu[i].name, pSystem ->stu[i].num); //打印姓名和学号
for(int j = 0; j < 3; j++)
{
printf("%.llf\t",pSystem ->stu[i].score[j]); // 打印各科成绩
}
printf("%.llf\n",pSystem ->stu[i].sum); // 打印总分
}
}
//查找学生姓名函数
int searchArray(struct stuSystem* pSystem, const char* name)
{
for(int i = 0; i < pSystem ->curSize; i++)
{
if(strcmp(pSystem ->stu[i].name, name) == 0) // 运用比较字符串进行比较
return i; // 如果成功找到,返回数组下标
}
return -1; // 没有找到,返回-1
}
//删除(学生信息)数组函数(数组的移位操作)
void deleteArray(struct stuSystem* pSystem, const char* name)
{
int pos = searchArray(pSystem, name);
if(pos == -1)
{
printf("没有找到此学生,无法删除!\n");
}
else
{
//利用指针的移位删除数组
for(int i = pos; i < pSystem ->curSize - 1; i++)
{
pSystem ->stu[i] = pSystem -> stu[i + 1];
}
pSystem ->curSize--;
printf("删除成功!\n");
}
}
//修改(学生信息)数组函数
void modifyArray(struct stuSystem* pSystem, const char* name)
{
int pos = searchArray(pSystem, name);
if(pos == -1)
{
printf("没有找到此学生,无法修改!\n");
}
else
{
printf("请输入该生新的姓名和学号:");
scanf("%s%d",pSystem ->stu[pos].name,&pSystem ->stu[pos].num);
printf("请输入新的三门课的成绩:");
pSystem ->stu[pos].sum = 0; //初始为零
for(int i = 0; i < 3; i++) //重新赋值
{
scanf("%lf",&pSystem ->stu[pos].score[i]);
pSystem ->stu[pos].sum += pSystem ->stu[pos].score[i];
}
printf("修改成功 \n");
}
}
//(数组的)排序函数(冒泡排序)
void SortBySum(struct stuSystem* pSystem)
{
//按照总分排序
for(int i = 0; i < pSystem ->curSize; i++)
{
for(int j = 0; j < pSystem ->curSize - i - 1; j++)
{
if(pSystem ->stu[j].sum < pSystem ->stu[j + 1].sum)
{
struct student temp = pSystem ->stu[j];
pSystem ->stu[j] = pSystem ->stu[j + 1];
pSystem ->stu[j + 1] = temp;
}
}
}
}
//整个系统的文件操作就是数组的文件操作
void readFile(struct stuSystem* pSystem, const char* fileName)
{
FILE* read = fopen(fileName, "r"); //打开文件
if(read == NULL) //如果打开失败
{
read = fopen(fileName, "w+"); //创立一个新的文件
fclose(read); //关闭文件
}
else
{
pSystem ->curSize = 0;
while(1) //feof--检测文件的末尾指示器是否被设置
{
if(feof(read))
{
break;
}
//如果没有设置,重新设置
int result = fscanf(read, "%s\t%d\t", pSystem ->stu[pSystem->curSize].name, &pSystem->stu[pSystem->curSize].name);
for(int j = 0; j < 3; j++)
{
result = fscanf(read, "%lf\t", &pSystem->stu[pSystem->curSize].score[j]);
}
result = fscanf(read, "%lf\t", &pSystem->stu[pSystem->curSize].sum);
pSystem->curSize++;
}
}
}
//更改文件操作
void saveFile(struct stuSystem* pSystem, const char* fileName)
{
FILE* save = fopen(fileName, "w"); //从文件头开始写入
for(int i = 0; i < pSystem->curSize; i++)
{
//用打印文件函数将所有的信息打印在文件中
fprintf(save,"%s\t%d\t", pSystem->stu[i].name,pSystem->stu[i].num);
for(int j = 0; j < 3; j++)
{
fprintf(save, "%.1lf\t",pSystem->stu[i].score[j]);
}
fprintf(save, "%.1lf\n", pSystem->stu[i].sum);
}
fclose(save); //关闭文件
}
//寻找并打开某一个系统的函数(打开系统的钥匙)
void keyDown(struct stuSystem* pSystem)
{
// 按键输入+开关语句(switch)
int userKey = 0;
scanf("%d",&userKey); // 输入钥匙
int result = userKey;
int pos = 0; // 查找判断
char name[18] = "";
switch(userKey) // 用钥匙打开系统的某个操作
{
case 0:
printf("------------退出系统-----------\n");
printf("退出成功 \n");
system("pause");
exit(0); //退出界面函数
break;
case 1:
printf("------------录入学生信息-----------\n");
inputStu(pSystem); //调用输入函数
saveFile(pSystem, "student.txt"); //调用修改文件操作函数
break;
case 2:
printf("------------浏览学生信息-----------\n");
printfArray(pSystem); //调用打印学生信息函数
break;
case 3:
printf("------------删除学生信息-----------\n");
printf("请输入要删除学生的姓名:");
scanf("%s",name);
deleteArray(pSystem, name); //调用删除函数
break;
case 4:
printf("------------修改学生信息-----------\n");
printf("请输入修改学生的姓名:");
scanf("%s", name);
modifyArray(pSystem, name);//调用修改函数
saveFile(pSystem, "student.txt"); //调用修改文件操作函数
break;
case 5:
printf("------------查找学生信息-----------\n");
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
pos = searchArray(pSystem, name); // 调用查找函数
if(pos == -1)
{
printf("未找到相关学生信息!\n");
}
else
{
printf("姓名\t编号\t数学\t英语\t体育\t总分\n");
printf("%s\t%d\t",pSystem ->stu[pos].name, pSystem ->stu[pos].num); //打印姓名和学号
for(int i = 0; i < 3; i++)
{
printf("%.lf\t", pSystem ->stu[pos].score[i]); // 打印各科成绩
}
printf("%.lf\n", pSystem ->stu[pos].sum); // 打印总分
}
break;
case 6:
printf("------------学生排序信息-----------\n");
SortBySum(pSystem); //调用排序函数
printfArray(pSystem); //然后调用打印函数打印信息
break;
default:
printf("输入错误!请重新输入!\n");
break;
}
}
int main()
{
struct stuSystem* pSystem = createSystem(); //创建一个结构指针插入某个系统
readFile(pSystem, "student.txt"); // 调用(读取/系统)文件操作函数并设立一个文件
while (1)
{
makeMenu(); // 调用函数并打印出菜单
keyDown(pSystem); //调用打开系统函数
system("pause");
system("cls"); // 刷新屏幕
}
return 0;
}
如果对你有帮助,一定要三连支持一下哦!!!