MiNi的“湘北高中”学生信息管理系统 (C++实现)

 
 

自己随便写的一个湘北高中学生信息管理系统,核心是利用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;
}

代码其实挺简单的。在这里提一些我写的时候出的一些错误:

  1. 在PATH指定路径的.txt文档一定要注意格式是否是windows下的编码格式。因为在不同的操作系统下,对于换行的定义是不一样的,格式会影响的执行结果。
    在这里插入图片描述
  2. 在使用fstream流的时候,注意一下打开方式:默认是覆盖原文件。ios::app是追加模式。
  3. cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
  4. 当同时使用cin>>,getline()时,需要注意的是,在cin>>输入流完成之后,getline()之前,需要通过
str="\n";
getline(cin,str);

的方式将回车符作为输入流cin以清除缓存,如果不这样做的话,在控制台上就不会出现getline()的输入提示,而直接跳过,因为程序默认地将之前的变量作为输入流。

  1. 关于此项目的相关拓展,大家可以留意: Github地址
发布了187 篇原创文章 · 获赞 208 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/tonglin12138/article/details/103583604