c语言 文件 学生管理,c语言学生管理系统之文件操作

这篇博客介绍了如何在C语言中实现一个简单的学生管理系统,重点在于文件操作。通过定义学生信息结构体,利用fopen、fread、fwrite等函数进行文件的读写。读操作从文件中读取学生信息并显示,写操作将学生信息追加到文件末尾。同时,提供了增加学生信息和读取学生信息的用户交互界面。主要涉及的文件操作模式包括只读、追加、读写等。
摘要由CSDN通过智能技术生成

介绍

前面写了一篇学生管理系统demo,但是觉得还是少了c中关键的文件相关操作,所以在这里也顺带把文件操作也加到学生管理系统里面去。当然,这里就没有学生系统那么复杂了,主要还是文件的操作。

实现

首先还是照旧,先定义学生信息和课程信息,但是这里就没有用链表存储学生信息了,直接放文件里,要的时候再拿,因为主要是讲解文件操作,故没有作缓存:

#define MAX_NAME_LENGTH20

#define MAX_COURSE_NAME_LENGTH30

#define MAX_COURSE5

static char g_course[MAX_COURSE][MAX_COURSE_NAME_LENGTH] =

{"c语言", "算法", "c++语言", "英语", "数学"};

///@brief 定义学生信息

typedef struct _Student

{

int no;///< 学号 唯一

char name[MAX_NAME_LENGTH];///< 姓名

float score[MAX_COURSE];///< 每个课程的分数

}Student;

下面就是文件操作读操作:

///@brief 从文件中读出学生信息

void readFromFile(const char* fileName)

{

Student stu = {0};

int i = 0;

int count = 0;

FILE* fp = fopen(fileName, "rb");

if (NULL == fp)

{

printf("open file[%s] failed.\n", fileName);

return;

}else

{

printf("open file[%s] success.\n", fileName);

}

printf("学号 姓名 ");

for (i = 0; i < MAX_COURSE; ++ i)

{

printf("%s ", g_course[i]);

}

printf("\n");

while ( !feof(fp))

{

count = fread(&stu, sizeof(Student), 1, fp);

if (ferror(fp))

{

printf("fread error.\n");

break;

}

if (0 == count)

{

break;

}

printf("%d %6s ", stu.no, stu.name);

for (i = 0; i < MAX_COURSE; ++ i)

{

printf("%4.2f ", stu.score[i]);

}

printf("\n");

}

fclose(fp);

return;

}

首先用fopen打开,fopen第一个是文件名,不难理解。主要还是在第2个参数上,其模式比较多,主要有以下几种模式:

r:只读模式,如果文件不存在,则fopen返回失败。

w:只写模式,如果文件存在,则会把文件内存清空。

a:在文件的末尾追加数据,并且在新数据之前不清除EOF标志(这是文档的解释,但是我查看了下,还是没有发现这个EOF标志),如果文件不存在则创建。

r+:以读写的方式打开文件,文件必须存在。

w+:以读写的方式打开文件,并把文件内存清空。

a+:在文件的末尾追加数据,并且在新数据的后面保存EOF标志,如果文件不存在则创建。

t:以文本的模式打开,Ctrl+Z被认为是文件末尾,而且写入文件时会把\r\n写成\n,读出的,把\n读成\r\n。此标志windows下特有, linux无。

b:以二进制模式打开,文件内容是怎样就怎样。此标志windows下特有, linux无。

打开文件之后,就是fread读取文件,这里直接把学生信息读取到结构体当中,并且在循环开始处用feof判断是否已经到了文件尾。ferror用来判断文件操作是否失败,而fread返回0则说明没有内容可以读取。

后面接着就是写入学生信息到文件:

///@brief 把学生信息写入文件

void writeToFile(const char* fileName, Student* stu)

{

FILE* fp = fopen(fileName, "a+b");

if (NULL == fp)

{

printf("open file[%s] failed.\n", fileName);

return;

}else

{

printf("open file[%s] success.\n", fileName);

}

fwrite(stu, sizeof(Student), 1, fp);

fclose(fp);

}

调用fwrite一次性把整个学生结构体追加到文件末尾。

然后就是输入信息的界面:

///@brief 增加学生

void addStudentMenu(const char* fileName)

{

int i = 0;

Student stu = {0};

printf("请输入学生的信息:\n");

printf("学号:");

scanf("%d", &(stu.no));

printf("姓名:");

scanf("%s", stu.name);

for (i = 0; i < MAX_COURSE; ++ i)

{

printf("%s分数:", g_course[i]);

scanf("%f", &(stu.score[i]));

}

writeToFile(fileName, &stu);

printf("插入学生信息成功。\n");

}

///@brief 退出系统

void exitMenu()

{

printf("谢谢使用。\n");

}

///@brief 从文件中读取学生信息

void readStudentInfo()

{

char fileName[256] = {0};

char quit = 'n';

printf("请输入需要读取学生信息的文件名:");

scanf("%s", fileName);

readFromFile(fileName);

}

///@brief 把学生信息写入文件

void writeStudentToFile()

{

char fileName[256] = {0};

char quit = 'n';

printf("请输入需要写入学生信息的文件名:");

scanf("%s", fileName);

addStudentMenu(fileName);

}

main函数:

int main(int argc, char* argv[])

{

mainMenu();

return 0;

}

主体界面如下:

ccef67169323fdfabd6ae9f72b1bb116.png

总结

总体来说,文件操作不算太复杂,一起也就这么几个函数:fopen(打开文件),fread(读文件),fwrite(写文件),fclose(关闭文件),feof(判断文件是否到文件尾),ferror(判断文件指示器是否有错误),fflush(把缓存写入到流中)。

[download id=”1016″ template=”button”]

C语言学生成绩管理系统(以包含文件的形式写的),结构体,链表,数组,以下是main.c #include #include #include #define m 3/*宏定义m的值为3*/ struct node/*链表初始化*/ { char name[20]; int no; float score[m]; float sum; float avg; struct node *next; }; char ch[m+4][20]={{"学号"},{"姓名"},{"语文"},{"数学"},{"英语"},{"总分"},{"平均分"}};/*定义并初始化一个全局二维字符数组*/ #include "save.c"/*包含保存文件*/ #include "read.c"/*包含读取文件*/ #include "output.c"/*包含打印文件*/ #include "set.c"/*包含录入文件*/ #include "demand.c"/*包含查询文件*/ #include "sort.c"/*包含排序文件*/ #include "modified.c"/*包含修改文件*/ #include "add.c"/*包含添加文件*/ #include "del.c"/*包含删除文件*/ void main() { int n; printf("\n\t\t\t欢迎使用学生成绩管理系统\n\n"); printf("\t\t\t\t\t\t制 作: XIA XIA\n"); do { printf("\n\n1:学生成绩录入,并保存\n"); printf("2:学生成绩查询\n"); printf("3:学生成绩的排序\n"); printf("4:学生成绩的修改\n"); printf("5:学生成绩的打印\n"); printf("6:学生信息的添加\n"); printf("7:学生信息的删除\n"); printf("0:退出学生成绩管理系统\n\n\n"); printf("输入你要执行操作的相应序号\n"); scanf("%d",&n);/*输入相就的操作的序号*/ switch (n) { case 1: set();break;/*调用录入函数*/ case 2: demand();break;/*调用查询函数*/ case 3: sort();break;/*调用排序函数*/ case 4: modified();break;/*调用修改函数*/ case 5: output();break;/*调用打印函数*/ case 6: add();break;/*调用添加函数*/ case 7: del();break;/*调用删除函数*/ case 0: printf("正在退出学生成绩管理系统......\n");exit(0);/*直到输入“0”退出学生成绩管理系统*/ default:printf("输入错误码,请重新输入\n"); } }while(1); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值