前言
大家好,我是卷卷,本节课是最后一讲,学生管理系统。本节课主要有以下三个部分:文件操作,系统介绍,作业。(讨论q群号744931080,教程资源在群内)
一、文件操作
程序是在内存中运行的,一旦程序结束,运行期间输入的数据就会被释放。如何将数据保存到硬盘上呢?C语言提供了文件操作。与文件相关的数据类型,函数都是定义在stdio头文件中的,所以无需额外声明一个头文件。接下来我们看如何使用文件操作?首先定义一个文件指针FILE*,然后使用打开文件函数fopen。举例如下:
FILE* fp;
fp=fopen("filepath","type");
其中filepath是文件路径,用双引号包围。文件路径的分隔符用一个左斜杠“/”或两个右斜杠“\”。比如:C:\Windows\Boot或者C:/Windows/Boot
文件路径又分为绝对路径和相对路径,绝对路径就是具体的文件位置,比如上述例子。相对路径就是相对当前编程文件的路径。比如,我在D:/test路径下创建了cpp文件,在文件中使用文件操作,则相对路径就是相对该cpp文件的目录而定的。比如路径”stu.txt”,它就放在和cpp文件同一目录下,即test文件内。而路径“…/stu.txt”就表示当前cpp文件的上一层目录,即D盘根目录。“…/”可以多次使用,表示往上追溯多级目录。
type是文件的打开方式,具体如表10.1所示。特别注意,在文件指针使用完后,应及时用fclose()关闭文件:fclose(fp);
表10.1 文件的打开方式
最常用的使用方式是只读r,只写w和追加a。r是从文件中读取数据,一般用于查找操作。w是向文件写入数据,一般用于修改操作,注意写入之前会清空之前的数据。a是在文件末尾添加数据,一般用于增加操作。接下来看下部分文件输入输出函数:
表10.2 部分文件输入输出函数
最常用的函数:fgetc(),fscanf(),fprintf()。下面是文件指针移动函数:
关于偏移量,n表示偏移n个字节,也可以加上L,效果一样。关于起始位置,有三个宏定义:
起始点 | 常量名 | 常量值 |
---|---|---|
文件开头 | SEEK_SET | 0 |
当前位置 | SEEK_CUR | 1 |
文件末尾 | SEEK_END | 2 |
接下来是实例:
#include<stdio.h>
struct student{
int no;
double grade;
char name[20];
};
student* stu=new student;
int main(){
FILE* fp=fopen("test.txt","r+");
if(fp){
while(getc(fp)!=EOF){
fseek(fp,-1L,SEEK_CUR);
fscanf(fp,"%d %f",&stu->no,stu->grade);
}
stu->no=1,stu->grade=100;
fprintf(fp,"%d %f",stu->no,stu->grade);
fclose(fp);
}
return 0;
}
首先定义了一个结构体指针,然后以可读可写的形式打开文件。如果打开的文件不为空,则开始循环。每个文件都会有一个文件结束标志,它是-1或EOF。所以循环时,先读一个字符比如ch,看看这个ch是否为文件末尾标志。如果不是,就用fseek函数向前回溯一个单位,然后将文件信息输入到变量中。注意从文件输入变量用fscanf函数,输出到文件中用fprintf函数。然后将变量写入文件,最后不要忘了关闭文件哦。
二、系统介绍
1.系统功能模块:
查询学生信息会稍微复杂一点,包括两个子功能,按姓名查询和查询所有人,查询所有人功能上又有两个小功能,按年龄升序或者降序。
2.系统详细要求
(1)整体要求:完成增删改查功能,并将程序运行期间的数据保存到硬盘上。
(2)结构体:定义两个结构体,一个结构体表示学生个体。包括姓名,性别,年龄,专业,学号,班号。年龄用int,其余用char数组存储。另一个结构体表示结构体列表,存放学生结构体数组和数组长度。
(3)主界面:显示菜单,包括增加,修改,删除,查询,退出这5个选项。
(4)增加:输入要添加的人数,然后输入学生信息。并对输入的学号检测,若学号重复,则给出提示,并让用户反复输入直到学号不重复。添加完后,显示成功信息。每次输入数据后,将数据追加到txt文件中。
(5)删除:输入待删除的学生姓名,查找,包括重名的学生。若学生未找到,给出提示。若找到,则删除学生信息并给出提示。所有的删除操作完成后,将所有数据写入txt文件。
(6)修改:输入待修改的学生姓名,查找,包括重名的学生。若学生未找到,给出提示。若找到,则让用户输入学生信息。并对输入的学号检测,做法和增加功能一样。修改完后,显示成功信息。所有的修改操作完成后,将所有数据写入txt文件。
(7)查询:若无数据,给出提示。若有数据,给出查询方式:查询所有人或按姓名查询。按姓名查询包括重名的学生。查询所有人下再给出查询方式:按年龄降序或按年龄升序查询,用户选择其中一个后,对数据排序,输出结果。
(8)退出:退出程序即可。
3.部分运行结果展示:
三、作业
恭喜大家走到了这里,你们离掌握C语言还差一步!请完成前面要求的学生管理系统。建议尽量花时间去做,等做得差不多了再对答案。答案不作输入合法性检测,大家可在完成系统功能的基础上自行添加。有其它想法也可以动手实现,逐步完善自己的系统,这就是编程的乐趣。我相信大家做完后,C语言肯定都比较扎实了。感谢大家一直以来的坚持,你们的坚持就是我的动力。学会C语言仅是计算机学习的冰山一角,如果你对其它计算机知识感兴趣,希望你们能够顺着兴趣,再接再厉!最后祝大家学业有成,梦想成真!再见!!