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 + -
显示快捷键?