p73.cpp

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

CPP
166
字号
#include <fstream.h>
#include <string.h>

char * makeCopy(char * pszS)
{
	char *pszT=new char[strlen(pszS)+1];
	strcpy(pszT,pszS);
	return pszT;
}
class Student
{
public:
	Student(char * pLN,char * pFN,
		int nGrd,unsigned long ulId);
	virtual ~Student();
	
	void display(ostream& out)const;
	void save(ostream& out);
	static Student * restore(istream& in);
	
protected:
	char * pLName;
	char * pFName;
	int nGrade;
	unsigned long ulID;
};
Student::Student(char * pLN,char *pFN,
				 int nGrd,unsigned long ulId)
{
	pLName=makeCopy(pLN);
	pFName=makeCopy(pFN);
	
	nGrade=nGrd;
	ulID=ulId;
}
Student::~Student()
{
	delete pLName;
	delete pFName;
}
void Student::display(ostream& out)const
{
	out<<pLName<<","<<pFName
		<<"-"<<ulID
		<<"(Grade"<<nGrade<<")";
}
void Student::save(ostream& out)
{
	out<<"<"<<pLName<<">"
		<<"<"<<pFName<<">"
		<<nGrade<<" "
		<<ulID<<"\n";
}
Student * Student::restore(istream& in)
{
	char buffer[80];
	int nC;
	if((nC=in.get())!='<')
	{
		in.getline(buffer,sizeof buffer);
		in.clear(ios::failbit|in.rdstate());
	}
	char szFirstName[80];
	in.getline(szFirstName,sizeof szFirstName,'>');
	
	if((nC=in.get())!='<')
	{
		in.getline(buffer,sizeof buffer);
		in.clear(ios::failbit|in.rdstate());
	}
	char szLastName[80];
	in.getline(szLastName,sizeof szFirstName,'>');
	
	int nGrade;
	unsigned long ulID;
	in>>nGrade>>ulID;
	
	in.getline(buffer,sizeof buffer);
	
	if(nGrade<-2||nGrade>12)
	{
		in.clear(ios::failbit|in.rdstate());
	}
	if(in.fail())
	{
		return (Student *)0;
	}
	else
	{
		return new Student(szLastName,szFirstName,nGrade,ulID);
	}
}
ostream& operator<<(ostream& out,const Student& s)
{
	s.display(out);
	return out;
}
int saveTheStudents(char * pszTempFileName)
{
	ofstream out(pszTempFileName);
	if(out.fail())
	{
		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.fail())
	{
		cout<<"Error writing "
			<<pszTempFileName<<"\n";
		return 0;
	}
	return 1;
}
void restoreAndDisplay(char * pszTempFileName)
{
	ifstream in(pszTempFileName);
	if(in.fail())
	{
		cout<<"Error opening file "
			<<pszTempFileName<<"\n";
		return;
	}
	int i=0;
	
	Student * psStudent;
	for(;;)
	{
		psStudent=Student::restore(in);
		if(in.fail())
		{
			if(in.eof())
			{
				return;
			}
			cout<<(in.bad()?"Unrecoverable":"Recoverable");
			cout<<" error reading"
				<<pszTempFileName<<"\n";
			return;
		}
		cout<<"#"<<++i
			<<"-"<<(* psStudent)<<"\n";
		delete psStudent;
	}
}

int main(int,char **)
{
	int bRetStat=
		saveTheStudents("D:\\ifile.txt");
	if(bRetStat)
	{
		restoreAndDisplay("D:\\ifile.txt");
	}
	return 0;
}

⌨️ 快捷键说明

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