一、功能
浏览、增加、查询、修改、挂失
二、分析
核心是内存、文件的同步。
这里内存是指数据存储方式,本项目以链表存储数据。也可以用数据结构时学习的链表,这里采用STL下的 list 库。
首先从文件中利用 fscanf 读取信息存入链表;
⛳️浏览:直接打印链表;
🚤增加:采用尾插入链表,同时更新文件,利用 fprintf 写入数据到文件末尾;
⛵️查询:利用 for(reader r:L)
遍历链表 (ps:由于结点是结构体,目前本人只找到这种方式遍历);
🚣修改、挂失:对链表的修改都是先删除某结点(erase)再插入(insert),而文件的修改只能重写文件,即将链表 fprintf 进文件,实现内存与文件同步。
本程序的🚥难点在于STL的 list 与结构体的结合,其中涉及到迭代器(ps:对list的修改必须使用迭代器)。
三、代码
//读者管理系统 编译环境:vs 2019
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;
#include <list> //C++下的
#include <stdlib.h>
typedef struct reader {
char code[20]; //证件号
char name[30]; //姓名
char sex[5]; //性别
char dept[50]; //系别
int tag; //证件状态
int num; //下标,如果通过r:L是做不到的,只能迭代访问,不能改变值
}reader;
list<reader> L; //每个节点都是reader类型
list<reader>::iterator it; //迭代器
reader line; //读取文件时,每一行都是一个reader
reader temp;
reader findit; //查找读者时,记录读者
int flag = 0;
void menu();
void show();
void UpdateFile();
void BrowseReader();
void ModifyReader();
void in(reader r);
int SelectMenu();
int cmp(char a[], char b[]);
//增加读者
void InputReader(); //录入读者信息,建立读者信息的链表
void SaveReader(); //将读者信息链表,保存到reader.txt文件中
//查询读者
int Find_Code(); //按照证件号查找
int Find_Name(); //按照姓名查找
int main()
{
FILE* fp = fopen("reader.txt", "r"); //r权限
for (int i=0; ;i++ )
{
//每个读者相当于一个结点,读入链表中
if (~fscanf(fp, "%s%s%s%s%d", line.code, line.name, line.sex, line.dept, &line.tag)) //对于文件,如果不为空,则读取到结点
{
line.num = i; //下标</