自己随便写的一个湘北高中学生信息管理系统,核心是利用fstream的文件读写操作。
先看一下运行结果:
]
数据的基本操作:增删查改功能都已经实现。 其实这个项目拓展性还是蛮高的,可以基于此再做一些UI方面的优化,包括一些拓展功能的实现和完善。下面给出源码:
Stuinfo.h
#ifndef STUINFO_H
#define STUINFO_H
#include <fstream>
#include<string>
#include <vector>
#include <iostream>
#include<windows.h>
#include <fcntl.h>
#include<stdio.h>
using namespace std;
const string PATH = "D:\\学生信息.txt";
class UI{
public:
void Menu();
bool Search();
void Show();
bool Add();
void Modify();
void Delete();
private:
vector<string> _stuinfo;
};
class Stu{
public:
char _name[5];
char _sex[3];
short _age;
short _num;
char _address[12];
short _score;
public:
Stu();
~Stu();
};
#endif
Stuinfo.cpp
#include"Stuinfo.h"
void UI::Menu(){
cout<<"******************************************"<<endl;
cout<<"*******欢迎进入MiNi湘北高中管理系统*******"<<endl;
cout<<"******************************************"<<endl;
cout<<"*******1.查询信息*******"<<endl;
cout<<"*******2.添加信息*******"<<endl;
cout<<"*******3.修改信息*******"<<endl;
cout<<"*******4.删除信息*******"<<endl;
cout<<endl;
cout<<"请输入您的选择:-> ";
}
void UI::Show(){
for(int i=0;i<_stuinfo.size();++i){
cout<<_stuinfo[i]<<endl;
}
}
/////////////////////////////////////////////////////
bool UI::Search(){
////mother fucker .... 记事本的换行读取格式问题
_stuinfo.clear();
ifstream in(PATH.c_str());
if(!in.is_open()){
return false;
}
string content;
while(getline(in,content)){
_stuinfo.push_back(content);
}
Show();
in.close();
return true;
}
////////////////////////////////////////////
bool UI::Add(){
//数据添加的时候没有在新的一行去添加
string content;
cout<<" 请输入您需要添加的完整信息: "<<endl;
//需要清空输入流
string str="\n";
getline(cin,str);
getline(cin,content);
std::ofstream file(PATH.c_str(),ios::binary | ios::in | ios::app);
if(!file.is_open()){
return false;
}
//string s1="\n";
//file<<s1;
file<<content<<endl;
//file.write(content.c_str(),content.size());
file.close();
return true;
}
//////////////////////////////////
void UI::Modify(){
string name;
string tmp;
cout<<"请输入需要修改的学生名字: "<<endl;
cin>>name;
size_t len=name.size();
int i=0;
for(;i<_stuinfo.size();++i){
tmp=_stuinfo[i].substr(0,len);
if( strcmp(tmp.c_str(),name.c_str())==0 ){
break;
}
else
continue;
}
tmp=_stuinfo[i];
cout<<"请输入您修改后的完整数据: "<<endl;
string part;
string str="\n";
getline(cin,str);
getline(cin,part);
_stuinfo[i]=part;
//将_stuinfo中的 内容覆盖原文件
std::ofstream file(PATH.c_str(),ios::binary | ios::in ); //没有选择追加模式
string content;
for(int i=0;i<_stuinfo.size();++i){
content=_stuinfo[i];
//file.write(content.c_str(),content.size());
file<<content<<endl;
}
file.close();
return ;
}
void UI::Delete(){
//删除指定数据项
string name;
string tmp;
cout<<"请输入需要删除项的学生名字: "<<endl;
cin>>name;
size_t len=name.size();
int i=0;
for(;i<_stuinfo.size();++i){
tmp=_stuinfo[i].substr(0,len);
if( strcmp(tmp.c_str(),name.c_str())==0 ){
break;
}
else
continue;
}
_stuinfo[i]=" NULL (Deleted)";
std::ofstream file(PATH.c_str(),ios::binary | ios::in ); //没有选择追加模式
string content;
for(int i=0;i<_stuinfo.size();++i){
content=_stuinfo[i];
//file.write(content.c_str(),content.size());
file<<content<<endl;
}
file.close();
return ;
}
main.cpp
#include "Stuinfo.h"
int main(){
UI u1;
int input;
do{
u1.Menu();
cin>>input;
switch(input){
case 1: u1.Search(); break; //查
case 2: u1.Add();break; //添
case 3: u1.Modify();break; //改
case 4: u1.Delete();break; //删
default:
cout<<"请输入正确的选择: "<<endl;
break;
}
cout<<endl<<endl;
cout<<"温馨提示:输入非0值可以继续进行操作... ..."<<endl;
cout<<"请重新输入您的选择: ";
cin>>input;
}while(input!=0);
system("pause");
return 0;
}
代码其实挺简单的。在这里提一些我写的时候出的一些错误:
- 在PATH指定路径的.txt文档一定要注意格式是否是windows下的编码格式。因为在不同的操作系统下,对于换行的定义是不一样的,格式会影响的执行结果。
- 在使用fstream流的时候,注意一下打开方式:默认是覆盖原文件。ios::app是追加模式。
- cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
- 当同时使用cin>>,getline()时,需要注意的是,在cin>>输入流完成之后,getline()之前,需要通过
str="\n";
getline(cin,str);
的方式将回车符作为输入流cin以清除缓存,如果不这样做的话,在控制台上就不会出现getline()的输入提示,而直接跳过,因为程序默认地将之前的变量作为输入流。
- 关于此项目的相关拓展,大家可以留意: Github地址