174.returnout;
175.}
176.//重载输入符
177.istream&operator>>(istream&in,CStudent&right)
178.{
179.//输入除ID外的其他信息
180.in>>right.info.name>>right.info.sex>>right.info.major
181.>>right.info.grade>>right.info.ch>>right.info.en>>right.info.ma;
182.returnin;
183.}
184.
185./////////////////////////////////
186.//初始化函数//
187.////////////////////////////////
188.intinitial(vector&stu)
189.{
190.fstreamfile;//输入文件
191.CStudent*p;
192.
193.file.open(FILENAME,fstream:
:
in|fstream:
:
binary);//二进制输入打开
194.
195.if(!
file)//文件是否打开成功
196.return-1;
197.while(file.peek()!
=EOF)//是否到文件末尾
198.{
199.p=newCStudent();//新建一个学生对象
200.file.read((char*)p->getinfo(),sizeof(data));//读入学生对象
201.if(file.fail())//检查读入是否失败
202.return-2;
203.stu.push_back(p);//对象加入vector
204.}
205.if(!
stu.empty())//如果从文件读入了对象
206.CStudent:
:
nowid=stu.back()->getid()+1;//则自增id设置为最后一个学生id+1
207.file.close();//关闭
208.returnstu.size();//返回对象个数
209.}
210.////////////////////////////////
211.//信息增加函数//
212.///////////////////////////////
213.voidinsert(vector&stu)
214.{
215.charc='y';//输入控制字符
216.
217.intflag=1;//标志位,1表示新增成功
218.
219.CStudent*p=newCStudent();
220.
221.while(c!
='n')//是否继续新增
222.{
223.flag=p->set(false);//设置学生信息
224.if(flag==1)//如果设置成功
225.{
226.stu.push_back(p);//对象加入vector
227.p=newCStudent();//新建下一个对象
228.}
229.cout<<"是否继续添加学生(any/n)?
";
230.cin.clear();
231.cin.ignore(CIN_LEN,'\n');
232.cin.get(c);
233.}
234.//删除最后一个新建的对象,因为没有使用它
235.deletep;
236.CStudent:
:
nowid--;
237.}
238.
239.///////////////////////////////
240.//查询全部信息函数//
241./////////////////////////////
242.intcomparebynone(constvoid*a,constvoid*b)
243.{
244.return0;
245.}
246.////////////////////////////////
247.//按学号比较函数//
248.//////////////////////////////
249.intcomparebyid(constvoid*a,constvoid*b)
250.{
251.return*(constint*)a-((CStudent*)(b))->getid();
252.}
253.///////////////////////////////
254.//按姓名比较函数//
255.//////////////////////////////
256.intcomparebyname(constvoid*a,constvoid*b)
257.{
258.returnstrcmp((constchar*)a,(constchar*)(((CStudent*)b)->getname()));
259.}
260.////////////////////////////////
261.//按年级比较函数//
262.//////////////////////////////
263.intcomparebygrade(constvoid*a,constvoid*b)
264.{
265.return(*(constint*)a-((CStudent*)b)->getgrade());
266.}
267./////////////////////////////////////
268.//按总分和性别比较函数//
269.///////////////////////////////////
270.intcomparebymarkandsex(constvoid*a,constvoid*b)
271.{
272.doublemark;
273.charsex;
274.sscanf((constchar*)a,"%lf%c",&mark,&sex);
275.return!
(
276.(((CStudent*)b)->getsum()>=mark)
277.&&((sex=='n')||(sex==((CStudent*)b)->getsex()))
278.);
279.
280.
281.}
282.///////////////////////////////
283.//搜索模板//
284./////////////////////////////
285.template
286.voidsearchframe(constchar*info,T&condition,vector&stu,int(*compare)(constvoid*a,constvoid*b),boolisalter)
287.{
288.charc='y';
289.intflag;
290.while(c!
='n')
291.{
292.cin.clear();
293.
294.if(info!
=NULL)
295.{
296.cout<<"输入"<";
297.//cin.ignore(CIN_LEN,'\n');
298.cin>>condition;
299.}
300.
301.if(cin.fail())
302.{
303.cout<<"输入错误\n";
304.}
305.else
306.{
307.//遍历vector查找
308.for(vector:
:
size_typeix=flag=0;ix!
=stu.size();++ix)
309.{//判断是name是否相等
310.if(compare(&condition,stu[ix])==0)
311.{
312.if(isalter)
313.stu[ix]->set(isalter);
314.else
315.{
316.if(flag==0)
317.CStudent:
:
displayhead();
318.stu[ix]->displayinfo();
319.}
320.flag=1;
321.}
322.}
323.if(flag==0)//没有查到
324.{
325.cout<<"没有";
326.if(info==NULL)
327.cout<<"符合条件";
328.else
329.cout<330.cout<<"的学生\n";
331.}
332.}
333.cout<<"是否继续(any/n)?
";
334.cin.clear();
335.cin.ignore(CIN_LEN,'\n');
336.cin.get(c);
337.}
338.}
339.
340.////////////////////////////////
341.//信息检索函数//
342.//////////////////////////////
343.voidfetch(vector&stu)
344.{
345.intchoose,id,grade;
346.charname[20],markandsex[20];
347.
348.while(true)
349.{
350.cout<<"\n\t1.显示全部学生信息\n"
351."\t2.按学号查学生信息\n"
352."\t3.按姓名查学生信息\n"
353."\t4.按年级查学生信息\n"
354."\t5.按成绩和性别查询\n"
355."\t6.返回上级菜单\n\n";
356.lchoose:
357.cout<<"输入您的选择:
";
358.choose=0;
359.cin>>choose;
360.switch(choose)
361.{
362.case1:
searchframe(NULL,choose,stu,comparebynone,false);break;
363.case2:
searchframe("学号",id,stu,comparebyid,false);break;
364.case3:
searchframe("姓名",name,stu,comparebyname,false);break;