2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

一个比较规范的C语言多文件编程的例子

时间:12-30来源:作者:点击数:588

学习完C语言的基本课程,很多老师都会布置一个大作业,让同学们编写出学生信息管理系统。学生信息管理系统可以用来管理班级学生,对学生信息(包括姓名、性别、年龄、成绩等)进行增加、删除、更改、查询等操作。

该系统主要有两种实现方案:第一种将学生信息直接保存在二进制文件中,当需要查询或者更新时,要能够使用文件操作函数精确定位学生信息;第二种使用数据结构中的链表,将学生信息暂时缓存在链表,如果有变化,才更新到文件。

本节我们以第一种方案为例,搭建起学生信息管理系统的框架,将前面几节的知识综合运用起来。

创建一个文件夹,命名为 StuInfo,并添加以下几个文件:

可以看到,我们将所有的头文件放在了 include 目录,将所有的源文件放在了 module 目录,而 main.c 作为主模块,直接放在了 StuInfo 目录。下面是对各个文件的说明:

1) main.c

程序主模块,执行入口,会调用其他模块中的函数。

2) stu.c 和 stu.h

该模块包含了程序的大部分代码,实现了对学生信息的增删改查操作。

3) tools.c 和 tools.h

包含了一些通用的函数,比如文件复制、获取文件大小、数据插入、数据删除等与文件操作有关的函数(在《C语言文件操作》一章已经对它们进行了实现),这些函数不仅可以用于当前项目,也可以不加修改地移植到其他项目,通用性很强,不妨将它们称为工具型函数。

4) vars.c 和 vars.h

定义了一些全局变量。比如文件指针 fp、学生总数、文件长度等。

5) config.h

配置文件,几乎都是宏定义,比如规定了学号的最大值、姓名的最大长度、成绩的最大值、文件路径等。

下面给出了每个文件包含的简略代码。由于本节仅仅是演示,所以下面的代码不完整,我们将在《C语言项目实践》中讲解学生信息管理系统的具体编码。

main.c 源码:

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "./include/config.h"
  • #include "./include/stu.h"
  • #include "./include/vars.h"
  • int main(){
  • init();
  • //addStuInfo();
  • //deleteStuInfo();
  • //findStuByID();
  • //findStuByName();
  • fclose(fp);
  • return 0;
  • }

stu.c 源码:

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • #include "../include/config.h"
  • #include "../include/stu.h"
  • #include "../include/tools.h"
  • #include "../include/vars.h"
  • //初始化
  • void init(){
  • //打开文件
  • if( (fp=fopen(FILENAME, "rb+")) == NULL && (fp=fopen(FILENAME, "wb+")) == NULL ){
  • pause("Error on open %s file!", FILENAME);
  • exit(EXIT_FAILURE);
  • }
  • //获取文件长度
  • fileSize = getFileSize(fp);
  • }
  • //添加学生信息
  • void addStuInfo(){
  • //finsert(fp, nPreEleCount*stuSize, &stu, stuSize);
  • pause("提示:添加成功!按任意键返回...");
  • }
  • //删除学生信息
  • void deleteStuInfo(){
  • //fdelete(fp, index*stuSize, stuSize);
  • pause("提示:删除成功,按任意键返回...");
  • }
  • //修改学生信息
  • void alterStuInfo(){
  • //fwrite(&stu, stuSize, 1, fp);
  • pause("提示:修改成功,按任意键返回...");
  • }
  • //根据学号查询学生信息
  • void findStuByID(){
  • pause("错误:该学生信息不存在,查询失败!按任意键返回...");
  • }
  • //根据姓名查询学生信息
  • void findStuByName(){
  • pause("错误:没有查询到相关记录!按任意键返回...");
  • }
  • //根据成绩查询学生信息
  • void findStuByScores(){
  • pause("错误:没有查询到相关记录!按任意键返回...");
  • }
  • //显示所有学生信息
  • void showAllStu(){
  • pause("\n共有%d条学生信息,按任意键返回...", n);
  • }

stu.h 源码:

  • #ifndef _STU_H
  • #define _STU_H
  • //学生信息结构体
  • typedef struct _STU{
  • int id; //学号
  • char name[20]; //姓名
  • char sex[4]; //性别
  • int age; //年龄
  • float math; //数学成绩
  • float cn; //语文成绩
  • float en; //英语成绩
  • }STU;
  • //初始化
  • extern void init();
  • //学生信息增删改查
  • extern void addStuInfo();
  • extern void deleteStuInfo();
  • extern void alterStuInfo();
  • extern void findStuByID();
  • extern void findStuByName();
  • extern void findStuByScores();
  • extern void showAllStu();
  • #endif

tools.c 源码:

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <math.h>
  • #include <conio.h>
  • #include <stdarg.h>
  • //获取文件大小(以字节计)
  • long getFileSize(FILE *fp){
  • long fsize;
  • //TODO:
  • return fsize;
  • }
  • //文件复制函数
  • long fcopy(FILE *fSource, long offsetSource, long len, FILE *fTarget, long offsetTarget){
  • long nBytes = 0; //总共复制了多少个字节
  • //TODO:
  • return nBytes;
  • }
  • //向文件中插入内容
  • int finsert(FILE *fp, long offset, void *buffer, int len){
  • //TODO:
  • return 0;
  • }
  • //从文件中删除内容
  • int fdelete(FILE *fp, long offset, int len){
  • //TODO:
  • return 0;
  • }
  • //暂停程序
  • void pause(const char *str, ...){
  • va_list vl;
  • char buf[500] = {0};
  • va_start(vl, str);
  • vsnprintf(buf, 500, str, vl);
  • va_end(vl);
  • printf(buf);
  • getch();
  • printf("\n");
  • }

tools.h 源码:

  • #ifndef _TOOLS_H
  • #define _TOOLS_H
  • extern long getFileSize(FILE *fp); //获取文件大小
  • extern long fcopy(FILE *fSource, long offsetSource, long len, FILE *fTarget, long offsetTarget); //文件内容复制
  • extern int finsert(FILE *fp, long offset, void *buffer, int len); //向文件中插入数据
  • extern int fdelete(FILE *fp, long offset, int len); //删除文件内容
  • extern void pause(const char *str, ...); //暂停程序
  • #endif

vars.c 源码:

  • FILE *fp = NULL; //文件指针
  • int stuCount = 0; //总共有多少条学生信息
  • long fileSize = 0; //文件长度(占用的字节数)

vars.h 源码:

  • #ifndef _VARS_H
  • #define _VARS_H
  • extern FILE *fp;
  • extern int stuCount;
  • extern long fileSize;
  • #endif

config.h 源码:

  • #ifndef _CONFIG_H
  • #define _CONFIG_H
  • #define FILENAME "stu.data" //保存学生信息的文件名称(含路径)
  • #define MAX_STU_ID 99 //学号的最大值
  • #define MAX_STU_NAME 10 //姓名的最大长度
  • #define MAX_STU_AGE 100 //年龄的最大值
  • #define MAX_STU_MATH 150 //数学成绩的最大值
  • #define MAX_STU_EN 150 //英语成绩的最大值
  • #define MAX_STU_CN 150 //语文成绩的最大值
  • #endif

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门