📄 stuinfovec.h
字号:
#include "RecordVec.h"
#include "BasicStringTool.h"
using namespace BasicStringTool;
#include "FileStreamTool.h"
using namespace FileStreamTool;
namespace StudentInfomationManageStudio
{
enum SaveFileMark
{
VARIABLE_TYPE='$',
VARIABLE_VALUE=':',
VARIABLE_ARRAY='^'
};
class StuInfoVec
{
protected: RecordVec recVec;
public:
typedef vector<Record*>::iterator Iterator;
//添加新的学生的记录
virtual void addRecord(Record* rec)
{
recVec.push_back(rec);
}
//删除有"待删除"标志的记录
virtual int removePerform()
{
Iterator it;
int count=0;
for(it = recVec.begin(); it != recVec.end();)
{
if((*it)->toBeDeleted==true)
{
recVec.erase(it);
it=recVec.begin();
count++;
}
else
{
it++;
}
}
return count;
}
//寻找一个学生记录
virtual Iterator findRecord(const string& patten, int type, Iterator from)
{
Iterator it;
Iterator it_end = recVec.end();
std::string str_temp;
for(it = from; it != it_end; it++)
{
switch(type)
{
case 0: str_temp = (*it)->number; break;//0:Number
case 1: str_temp = (*it)->name; break;//1:Name
case 2: str_temp = NumberToString::FromInt((*it)->index); break;//2:Index
default:return it_end;
};
if(str_temp==patten)
{
return it;
}
}
return it_end;
}
//将学生信息保存到输出流中
virtual bool saveRecords(ofstream& fileStreamOut)
{
int TSize=this->size();
if(!fileStreamOut) return false;
Record *newRec;
for(int i=0;i<TSize;i++)
{
newRec=this->recVec[i];
if(newRec->toBeDeleted==false)
{
fileStreamOut<<(char)VARIABLE_TYPE<<"Begin" <<(char)VARIABLE_VALUE;
fileStreamOut<<(char)VARIABLE_TYPE<<"Number"<<(char)VARIABLE_VALUE<<newRec->number;
fileStreamOut<<(char)VARIABLE_TYPE<<"Name" <<(char)VARIABLE_VALUE<<newRec->name;
fileStreamOut<<(char)VARIABLE_TYPE<<"Index" <<(char)VARIABLE_VALUE<<newRec->index;
fileStreamOut<<(char)VARIABLE_TYPE<<"Gender"<<(char)VARIABLE_VALUE<<newRec->gender;
fileStreamOut<<(char)VARIABLE_TYPE<<"Score" <<(char)VARIABLE_VALUE<<DEFUALT_SCORE_AMOUNT;
for(int j=0;j<DEFUALT_SCORE_AMOUNT;j++)
{
fileStreamOut<<(char)VARIABLE_ARRAY<<(int)newRec->score[j];
}
fileStreamOut<<(char)VARIABLE_TYPE<<"End" <<(char)VARIABLE_VALUE;
fileStreamOut<<std::endl;
}
}
return true;
}
//从输入流中读入数据,并追加到当前学生信息记录的末尾
virtual int loadRecords(ifstream& fileStreamIn)
{
int count=0;
std::string variableType;
std::string variableValue;
if(!fileStreamIn) return false;
std::string number="unknown";
std::string name="unknown";
std::string gender="unknown";
int index=0;
float score[DEFUALT_SCORE_AMOUNT];
for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
{
score[i]=0;
}
while(!fileStreamIn.eof())
{
FileStreamGoto::Goto(fileStreamIn,(char)VARIABLE_TYPE);
variableType=StringFromFile::Get(fileStreamIn,(char)VARIABLE_VALUE);
fileStreamIn.get();
variableValue=StringFromFile::Get(fileStreamIn,(char)VARIABLE_TYPE);
if(variableType=="Begin")
{
number="unknown";
name="unknown";
gender="unknown";
index=0;
for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
{
score[i]=0;
}
}
else if(variableType=="Number")
{
number=variableValue;
}
else if(variableType=="Name")
{
name=variableValue;
}
else if(variableType=="Index")
{
index=0;
/*
int len=variableValue.length();
int temp;
bool eff=false;
for(int i=0;i<len;i++)
{
temp=variableValue[i]-'0';
if(temp<0||temp>9)
{
if(eff==false)
continue;
else
break;
}
index=10*index+temp;
eff=true;
}
*/
}
else if(variableType=="Gender")
{
gender=variableValue;
}
else if(variableType=="Score")
{
int count=0;
int len=variableValue.length();
int temp=0;
char ch;
bool eff=false;
for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
{
eff=false;
temp=0;
while(count<len)
{
ch=variableValue[count++];
if( ch==(char)VARIABLE_ARRAY
||ch==(char)VARIABLE_TYPE
||ch==(char)VARIABLE_VALUE)
{
break;
}
}
if(ch!=(char)VARIABLE_ARRAY)
{
break;
}
while(count<len && (ch=variableValue[count++])!=(char)VARIABLE_ARRAY)
{
if(ch<'0'||ch>'9')
{
if(eff==false)
continue;
else
break;
}
temp=10*temp+ch-'0';
eff=true;
}
count--;
score[i]=(float)temp;
}
}
else if(variableType=="End")
{
Record *newRec=new Record();
newRec->number=number;
newRec->name=name;
newRec->gender=gender;
newRec->sum=0;
for(int i=0;i<DEFUALT_SCORE_AMOUNT;i++)
{
newRec->score[i]=score[i];
newRec->sum+=score[i];
}
newRec->average=newRec->sum/DEFUALT_SCORE_AMOUNT;
newRec->index=index;
this->addRecord(newRec);
count++;
}
}//while
return count;
}
virtual ~StuInfoVec()
{
//...
}
//获得记录的学生数量
const int size() const {return (int)recVec.size();}
//是否无学生信息
const bool empty() const {return recVec.empty();}
//清空学生信息
virtual void clear(){recVec.clear();}
//获得第一条记录
Iterator first(){return recVec.begin();}
//获得超过最后一条记录之后的一个迭代器
Iterator pastEnd(){return recVec.end();}
};
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -