p154.cpp

来自「《C++编程指南(续编)》的一些程序源代码」· C++ 代码 · 共 163 行

CPP
163
字号
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

class Student
{
public:
	Student(const char * pLN,const char * pFN,
		int nGrd,unsigned long ulId);
	
	Student(const std::string& sLN,const std::string& sFN,
		int nGrd,unsigned long ulId);
	
	void display(ostream& out)const;
	
	void save(ostream& out)const;
	
	static Student * restore(istream& in);
	
protected:
	std::string sLName;
	std::string sFName;
	int nGrade;
	unsigned long ulID;
};
Student::Student(const char * pLN,const char * pFN,
				 int nGrd,unsigned long ulId)
				 :sLName(pLN),
				 sFName(pFN)
{
	nGrade=nGrd;
	ulID=ulId;
}
Student::Student(const std::string& sLN,const std::string& sFN,
		int nGrd,unsigned long ulId)
		:sLName(sLN),sFName(sFN)
{
	//sLName=sLN;
	//sFName=sFN;
	nGrade=nGrd;
	ulID=ulId;
}
void Student::display(ostream& out)const
{
	out<<sLName<<" , "<<sFName
		<<" - "<<ulID
		<<"(Grade"<<nGrade<<")";
}
void Student::save(ostream& out)const
{
	out<<"<"<<sLName<<">"
		<<"<"<<sFName<<">"
		<<nGrade<<" "
		<<ulID<<"\n";
}
static void cleanUp(istream& in)
{
	string sDiscard;
	if(!in.eof())
	{
		getline(in,sDiscard);
		in.clear(ios::failbit);
	}
}
Student * Student::restore(istream& in)
{
	if(in.get()!='<')
	{
		cleanUp(in);
		return (Student * )0;
	}
	std::string sLastName;
	getline(in,sLastName,'>');
	
	if(in.get()!='<')
	{
		cleanUp(in);
		return (Student * )0;
	}
	string sFirstName;
	getline(in,sFirstName,'>');
	
	int nGrade;
	unsigned long ulID;
	in>>nGrade>>ulID;
	
	if(sLastName.length()==0||
		sFirstName.length()==0||
		nGrade<-2||nGrade>12)
	{
		cleanUp(in);
		return (Student * )0;
	}
	in.get();
	return new Student(sLastName,sFirstName,nGrade,ulID);
}
ostream& operator<<(ostream& out,const Student& s)
{
	s.display(out);
	return out;
}
int saveTheStudents(char * pszTempFileName)
{
	ofstream out(pszTempFileName);
	if(out.bad())
	{
		cout<<"Error opening file"<<pszTempFileName<<"\n";
		return 0;
	}
	Student sJenny("Davis","Jenny",12,555555555L);
	sJenny.save(out);
	
	Student sLynn("Prater","Lynn",12,444444444L);
	sLynn.save(out);
	
	Student sCorder("Corder","Mary",10,333333333L);
	sCorder.save(out);
	
	if(out.bad())
	{
		cout<<"Error writing"<<pszTempFileName<<"\n";
		return 0;
	}
	return 1;
}
void restoreAndDisplay(char * pszTempFileName)
{
	ifstream in(pszTempFileName);
	if(in.bad())
	{
		cout<<"Error opening file "<<pszTempFileName<<"\n";
		return;
	}
	int i=0;
	Student * psStudent;
	for(;;)
	{
		psStudent=Student::restore(in);
		if(!psStudent)
		{
			if(!in.eof())
			{
				cout<<"Error reading "<<pszTempFileName<<"\n";
			}
			return;
		}
		
		cout<<" # "<<++i<<" - "<<(* psStudent)<<"\n";
		delete psStudent;
	}
}
int main(int argc,char **argv)
{
	int bRetStat=saveTheStudents("D:\\sfile.txt");

	if(bRetStat)
	{
		restoreAndDisplay("D:\\sfile.txt");
	}

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?