C++ 文件读写 实现简单的学生信息管理系统
写在前面:
这个程序的逻辑部分比较简单,只要对C++文件操作熟悉即可流畅地完成。
我在CSDN也看了一些其他人写的控制台信息管理系统,我认为我的程序较其他人还是有一些优点的。
比如:可对文件进行多次操作、每完成一步操作都会自动保存到文件中、功能较多、不会因为错误输入崩溃、代码、界面较简洁等。
–
技术环节:
编译环境:Windows VS2019
需求:
实现,对文件中的数据进行:添加、输出、根据多条件查找、根据多条件排序、插入、删除、修改、统计操作。
思路:
创建文件,循环将文件中的内容读取到list结构容器中,再根据容器中的值对数据进行处理。
在代码注释中详细标注了程序的实现步骤。
注意:
由于程序内部实现原因,由程序操作的文件的第一行,不可以被占用、必须空出来。
且文件最后一行不可以有多余的空行。
建议不要直接操作txt文件。
运行效果:
代码实现:
#include <iostream>
#include <fstream>
#include <list>
#include <sstream> //字符串转换
using namespace std;
//信息管理系统类
class Mamasys
{
private:
//学生全局结构
struct Student
{
//虽然学生属性都是字符串类型,但是后面对数据进行处理时,
//也会将部分字符串数据转换为数字类型进行操作
string name; //姓名
string age; //年龄
string num; //学号
string CppScore; //C++成绩
string MathScore; //高等数学成绩
};
list<Student> studlist; //存储所有学生信息的容器
string path; //文件路径
//将容器中所有信息写入到文件中
void ofsallMess()
{
ofstream ofst;
//以清空源文件内容方式打开文件
ofst.open(path, ios::trunc);
//判断文件是否打开成功
if (!ofst.is_open())
{
cout << "文件打开失败" << endl;
return;
}
//将容器中的所有信息写入到文件中,这里的endl必须在开头写,末尾不能写,否则会出现一系列问题
for (list<Student>::const_iterator it = studlist.begin(); it != studlist.end(); it++)
ofst << endl << it->num << endl << it->name << endl << it->age << endl << it->CppScore << endl << it->MathScore;
//关闭文件
ofst.close();
}
public:
//构造函数用于将文件中的内容按格式读取到list<Student>中
Mamasys()
{
cout << "输入你的文件路径,加后缀名,一般为txt文件(没有则创建该文件):" << endl;
cin >> path;
ifstream ifstr;
ifstr.open(path, ios::in); //打开文件路径中的文件,如果打开失败则创建该文件
if (!ifstr.is_open())
{
ofstream temp(path); //创建文件
temp.open(path,ios::out);
if (!temp.is_open()) //检测是否创建成功
{
cout << "创建文件失败,退出程序" << endl;
exit(-1);
}
//文件成功创建则关闭文件
temp.close();
}
system("cls");
//将文件中所有内容读取到list容器中
ifstream ifst;
ifst.open(path, ios::in);
char line[14]; //这里必须是字符数组
Student temp;
//空读取一行因为新文件第一行不保存内容
ifst.getline(line, sizeof(line));
//成行读取文件中的内容
//循环读取五行信息,每五行将信息插入到容器中
while (!ifst.eof())
{
//保存到临时学生temp中
ifst.getline(line, sizeof(line));
temp.num = line; //学号
ifst.getline(line, sizeof(line));
temp.name = line; //姓名
ifst.getline(line, sizeof(line));
temp.age = line; //年龄
ifst.getline(line, sizeof(line));
temp.CppScore = line; //C++成绩
ifst.getline(line, sizeof(line));
temp.MathScore = line; //高数成绩
//将temp插入到学生容器中
studlist.push_back(temp);
}
Hint(); //显示提示信息
}
//输出提示信息成员函数
void Hint()
{
cout << "--------学生信息管理系统--------" << endl << endl;
cout << "1 添加学生信息(尾部添加)" << endl;
cout << "2 查看所有学生信息" << endl;
cout << "3 查找学生信息(学号、姓名)" << endl;
cout << "4 排序学生信息(学号、成绩、升序、降序)" << endl;
cout << "5 插入学生信息(在输入学号信息前插入)" << endl;
cout << "6 删除学生数据(学号、姓名)" << endl;
cout << "7 修改学生数据(学号)" << endl;
cout << "8 输出统计数据(总和、平均值等)" << endl;
cout << "9 退出程序" << endl << endl;
cout << "所有功能在执行完毕后,都会自动将当前信息保存进文件" << endl << endl;
}
//添加学生信息
bool AddMess()
{
//创建一个学生结构
Student student;
L1:
//输出提示信息,并输入学生信息,输入-1结束输入
cout << "学号: "; cin