C++第九章习题解答_第1页
C++第九章习题解答_第2页
C++第九章习题解答_第3页
C++第九章习题解答_第4页
C++第九章习题解答_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第九章 流类库和输入/输出习题 本概念与基础知识测试题填空题9.1.1 在C+中“流”是表示 (1) 。从流中取得数据称为 (2) ,用符号 (3) 表示;向流中添加数据称为 (4) ,用符号 (5) 表示。答案:(1)数据从一个对象到另一个对象的传送(2)提取操作(3)(4)插入操作(5)(stream_extraction operator)(6)”)运算符在缺省情况下是跳过空白(包括空格,制表,backspace和回车等)的,这样拷贝的文件会缺少一些字符。第二,该程序应能确定文件是否拷贝结束。按行进行拷贝,getline()回车换行符并不放在buf中,因此要加一个回车换行符。对文件流,“

2、!”运算符完成什么功能?答:返回状态字state操作非法和操作失败这两位。二进制文件读函数read()能否知道文件是否结束?应怎样判断文件结束?答:读函数并不能知道文件是否结束,可用状态函数int ios:eof()来判断文件是否结束。必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断本次操作是否有效。由二进制文件和文本文件来保存对象各有什么优点和缺点?答:使用二进制文件,可以控制字节长度,读写数据时不会出现二义性,可靠性高。同时不知格式是无法读取的,保密性好。文件结束后,系统不会再读(见eofbit的说明),但程序不会自

3、动停下来,所以要判断文件中是否已没有数据。使用文本文件来保存对象,操作简单,但谁都可以读取这些数据,无保密性。文件的随机访问为什么总是用二进制文件,而不用文本文件?答:在C+中可以由程序来实现文件指针的移动,从而实现文件的随机访问,即可读写流中任意一段内容。一般文本文件很难准确定位,所以随机访问多用于二进制文件。怎样使用istream和ostream的成员函数来实现随机访问文件?答:在ios类中说明了一个公有枚举类型:enum seek_dirbeg=0,/文件开头cur=1,/文件指针的当前位置end=2/文件结尾;istream类中提供了如下三个成员函数:istream&istream:s

4、eekg(streampos);/指针直接定位istream&istream:seekg(streamoff, ios:seek_dir);/指针相对定位long istream:tellg();/返回当前指针位置seekg(streamoff,ios:seek_dir)应用最广,如:datafile.seekg(-20L,ios:cur);表示将文件定位指针从当前位置向文件头部方向移20个字节。datafile.seekg(20L,ios:beg);表示将文件定位指针从文件头向文件尾方向移20个字节。datafile.seekg(-20L,ios:end);表示将文件定位指针从文件尾向文件头

5、方向移20个字节。tellg()和seekg()往往配合使用。ostream类也提供了三个成员函数管理文件定位指针,它们是:ostream&ostream:seekp(streampos);ostream&ostream:seekp(streamoff,ios:seek_dir);long ostream:tellp();定位指针只有一个但函数有两组,这两组个函数功能完全一样。编程与综合练习题编程实现以下数据输入输出:以左对齐方式输出整数,域宽为12;以八进制、十进制、十六进制输入输出整数;实现浮点数的指数格式和定点格式的输入输出,并指定精度;把字符串读入字符型数组变量中,从键盘输入,要求输入

6、串的空格也全部读入,以回车换行符结束;以上要求用流成员函数和流操作子各做一遍。解:特别注意flags()和setf()的使用方法。注意注释。#include#includeusing namespace std;int main(void)int inum1=255,inum2=8191,inum3=65535;double fnum=31.415926535,fnum1;char str255;cout以左对齐方式输出整数,域宽为12:endl;cout.flags(ios:left);cout.width(12);coutinum1;cout.width(12);coutinum2;cou

7、t.width(12);coutinum3endl;cout.flags(ios:left|ios:oct|ios:showbase);/或(cout.flags()|ios:oct|ios:showbase)cout.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.setf(ios:hex,ios:hex|ios:oct);/或cout.setf(ios:hex);cout.unsetf(ios:oct);/特别注意第二个参数要包含第一个参数,否则两个参数位置上的位全清零,结果错co

8、ut.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.precision(10); /精度为10位,小数点后10位cout.setf(ios:scientific,ios:floatfield);/floatfield为0 x1800cout科学数表达方式:fnumn;cout.setf(ios:fixed,ios:floatfield); /设为定点,取消科学数方式cout定点表达方式:fnumn;cout请输入PI:fnum1;/输入3.1415926535coutfnum1n;/

9、由输出看输入精度无作用cin.get();/吸收回车cout请输入一个字符串:endl;cin.getline(str,255);coutstrendl;cout.flags(0);cout以左对齐方式输出整数,域宽为12:endl;coutleftdecsetw(12)inum1;coutsetw(12)inum2;coutsetw(12)inum3endl;coutshowbaseoctsetw(12)inum1;coutsetw(12)inum2;coutsetw(12)inum3endl;couthexsetw(12)inum1;coutsetw(12)inum2;coutsetw(1

10、2)inum3endl;coutsetprecision(10)scientific科学数表达方式:fnumn;coutfixed定点表达方式:fnumn; /精度10位,指小数点后10位return 0;修改【例9.3】,增加一个字符串输入后要求确认,以保证输入的字符串(如姓名、地址等)无误。解:#includeusing namespace std;int main(void)char ch,str255;docout请输入一个字符串:endl;cin.getline(str,255);coutstrendl;cout输入正确吗?Y or Nch;cin.get();/吸收输入Y or N

11、时留下的回车while(!(ch=Y|ch=y);cout输入正确:endl;coutstrendl;return 0;重载学生类的“”运算符。#include#include#include#includeusing namespace std;class studentint id ; /学号string name; / 姓名char sex; / 性别int age; / 年龄string address; /家庭地址float eng, phy, math, electron; /英语,物理,数学和电子学成绩public:student(int=0,string=#,char=#,in

12、t=0,string=#,float=0,float=0,float=0,float=0);friend ostream&operator(istream&sour,student&st); /重载提取运算符; /流类作为形式参数必须是引用student:student(int i,string n,char s,int a,string add,float en,float ph,float ma,float ele)id=i;name=n;sex=s;age=a;address=add;eng=en; phy=ph; math=ma; electron=ele;ostream&operat

13、or(ostream&dest,student&st) /重载插入运算符destst.idttst.sextst.agetst.addresstst.engtst.phytst.mathtst.electron(istream&sour,student&st) /重载提取运算符cout请输入学号:st.id;cout请输入姓名:;cout请输入性别:st.sex;cout请输入年龄:st.age;cout请输入地址:st.address;cout请输入英语、物理、数学、电子各科成绩:st.engst.physt.mathst.electron;return sour;int main()stu

14、dent st1,st2(2104105,陈英,m,19,黄山路380号,89,78,90,96);cinst1;coutst1”运算符,对所有可能的错误都能要求重输。解:#includeusing namespace std;class Complexdouble Real,Image;public:Complex(double r=0.0, double i=0.0):Real(r),Image(i);/定义构造函数/见【例5.7】,这里省略,以节约篇幅friend ostream&operator(istream&s,Complex&a); /流类作为形式参数必须是引用ostream&o

15、perator(ostream&s,const Complex &z)return s(z.Real,z.Image(istream&s,Complex &a)/格式为r;r,i;(r);(r,i);整个复数输完才可回车/容错强,如:sd(fr56cv,s79nml,45)i,78回车 可正确判读为(56,79)double re=0,im=0;char c=0;dosc;while(c!=(&c!=.&!(c=0&cc;while(c!=.&!(c=0&cre;/实部dos.get(c);/因为可能是回车while(c!=n&c!=)&c!=,);/读空数字串后的无用字符if(c=,)do/

16、只读数字串sc;while(c!=.&!(c=0&cim;/虚部dos.get(c);/因为可能是回车while(c!=n&c!=);/读空数字串后的无用字符else im=0;/无此步,第二次赋值出错if(c!=)s.clear(ios:failbit);/漏了括号给一个操作失败标志elses.putback(c);/无括号,返回一个字符到输入缓冲区sre;/实部dos.get(c);/因为可能是回车while(c!=n&c!=,);/读空数字串后的无用字符if(c=,)do/只读数字串sc;while(c!=.&!(c=0&cim;/虚部dos.get(c);/因为可能是回车while(c

17、!=n);/读空数字串后的无用字符else im=0;/无此步,第二次赋值出错if(s) a=Complex(re,im);return s;int main()Complex a,b,c,d;cout输入一个实数a;cout输入一个复数b;cout输入一个用括号括起来的实数c;cout输入一个用括号括起来复数d;couta=atb=btc=ctd=dn;return 0;以文本方式把一个文本文件(如+源文件)的前十行拷贝到一个新的文件中。解:注意只能用于纯文本文件,如用于word文件则失败。word文档构造前面有一大堆说明,按文本读必然失败。第二,用传统的运行库,按行读有可能丢失一些回车,而

18、用新的标准库则解决了这个问题。用VC+标准库函数,即用头文件iostream时,如果函数未能读到结束字符而停止,流出错(输入输出操作失败),后面不再读入,必须清0流状态字,才能继续读入。一行字符分几次读完,原来有可能无法判断是读到结束字符结束还是读到指定字符结束,现在可以判断了:如果流正常,则读到了结束字符。#include#include /不包含#includeusing namespace std;int main()int line=0;char filename256,buf256;fstream sfile,dfile;cout输入源文件路径名:filename;/对路径各方面而言

19、空格是无关紧要的,否则要用getline()等成员函数sfile.open(filename,ios:in);/打开一个已存在的文件while(!sfile)cout源文件找不到,请重新输入路径名:filename;sfile.open(filename,ios:in);cout输入目标文件路径名:filename; /只能创建文件,不能建立子目录,如路径不存在则失败dfile.open(filename,ios:out);if(!dfile)cout目标文件创建失败endl;return 1;while(sfile.getline(buf,256),sfile.eof()!=1&line10

20、)/按行拷贝 A行if(sfile.rdstate()=0) dfilebufn;/因流正常,读到回车符,但未提取 B行line+;elsedfilebuf;/流不正常,还未读到回车换行符,所以不加nsfile.clear();/状态字被置为0 x02,必须清0 sfile.close();dfile.close();return 0;用二进制方式,把一个文件连接到另一个文件的尾部,选择适当的文件打开方式完成。解:注意连接只能用于纯文本文件,如用于word文件则失败。如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。因为word文档构造前面有一大堆说明,真正连接时,后面的源文件

21、前面的说明要去掉,但这做不到。#include#include#includeusing namespace std;int main()int n;char filename256,buf100;fstream sfile,dfile;cout输入源文件路径名:filename;/对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数sfile.open(filename,ios:in|ios:binary);/打开一个已存在的二进制文件while(!sfile)cout源文件找不到,请重新输入路径名:filename;sfile.open(filename,ios:in|i

22、os:binary);cout输入目标文件路径名:filename; /只能创建文件,不能建立子目录,如路径不存在则失败dfile.open(filename,ios:app|ios:out|ios:binary);/文件指针在尾部if(!dfile)cout目标文件创建失败endl;return 1;while(!sfile.eof()/二进制方式需另判文件是否结束 Asfile.read(buf,100);n=sfile.gcount();dfile.write(buf,n);/按实际读取字节数写 sfile.close();dfile.close();return 0;同上题,采用重新定

23、位文件指针方式来实现(随机访问方式)。解:同样连接只能用于纯文本文件,如用于word文件则失败。如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。因为word文档构造前面有一大堆说明,真正链接时,后面的源文件前面的说明要去掉,但这做不到。#include#include#includeusing namespace std;int main()int n;char filename256,buf100;fstream sfile,dfile;cout输入源文件路径名:filename;/对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数sfile.open(

24、filename,ios:in|ios:binary);/打开一个已存在的二进制文件while(!sfile)cout源文件找不到,请重新输入路径名:filename;sfile.open(filename,ios:in|ios:binary);cout输入目标文件路径名:filename; /只能创建文件,不能建立子目录,如路径不存在则失败dfile.open(filename,ios:in|ios:out|ios:binary); /打开输入输出文件if(!dfile)dfile.clear(0);dfile.open(filename,ios:out); /建立输出文件dfile.clo

25、se();dfile.open(filename,ios:in|ios:out|ios:binary); /改为输入输出文件dfile.seekp(0,ios:end);/写指针重定位到文件尾, seekp和seekg是同一个文件指针while(!sfile.eof()/二进制方式需另判文件是否结束 Asfile.read(buf,100);n=sfile.gcount();dfile.write(buf,n);/按实际读取字节数写 sfile.close();dfile.close();return 0;采用筛选法求100以内的所有素数(参见【例3.16】)。将所得数据存入文本文件和二进制文

26、件。对送入文本文件中的素数,要求存放格式是每行10个素数,每个数占6个字符,左对齐;可用任一文本编辑器将它打开阅读。二进制文件整型数的长度请用sizeof()来获得,要求可以正序读出,也可以逆序读出(利用文件定位指针移动实现),读出数据按文本文件中的格式输出显示。解:前半题文本文件与习题3.17相同,只是那里是右对齐,这里只新做了二进制文件。注意逆序输出前,试读看有多少数据时,一旦读到文件结束,eofbit=1,不清0,后面操作不能进行。#include#include#includeconst int n=100;void main()ofstream ofile;ifstream ifil

27、e;int an,i,j;char ch,b256;for(i=0;in;i+) ai=1+i;/用数组保存整数1-100a0=0;/1不是素数,置0for(i=0;in;i+)if(ai=0) continue;/该数已经置0,判断下一个数for(j=i+1;jn;j+) if(aj%ai=0) aj=0;/是ai倍数的元素置0;ofile.open(myfile9_9.txt);int count=0;ofile.flags(ios:left);ofile1-n之间的素数:endl;for(i=0;in;i+)/输出所有素数if(ai!=0)ofilesetw(6)ai;count+;if

28、(count%10=0) ofileendl;/每行10个数据ofile.close();cout是否要将文本文件输出?Y或Nch;if(ch=y|ch=Y)ifile.open(myfile9_9.txt);i=0;while(ifile.get(bi)/读标题,不可用,它不能读白字符,if(bi=n) break;i+;bi=0;cout.flags(ios:left);coutbi;/由文件读入if(ifile.eof()!=0) break;coutsetw(6)i;/屏幕显示count+;if(count%10=0) coutendl;/每行10个数ifile.close();cou

29、tendl;ofile.open(myfile9_9.dat,ios:out|ios:binary);for(i=0;in;i+)/输出所有素数if(ai!=0)ofile.write(char*)&ai,sizeof(int);ofile.close();cout是否要将二进制文件输出?Y或Nch;if(ch=y|ch=Y)count=0;ifile.open(myfile9_9.dat,ios:in|ios:binary);while(1)ifile.read(char*)&i,sizeof(int);if(ifile.eof()!=0) break;coutsetw(6)i;/屏幕显示c

30、ount+;if(count%10=0) coutendl;ifile.close();coutendl;cout是否要将二进制文件逆序输出?Y或Nch;if(ch=y|ch=Y)count=0;ifile.open(myfile9_9.dat,ios:in|ios:binary);while(1)ifile.read(char*)&i,sizeof(int);if(ifile.eof()!=0) break;count+;ifile.clear(0);/当文件读完时,eofbit=1,不清0,后面的操作不能进行ifile.seekg(-4,ios:end);for(j=1;j=count;j

31、+)ifile.read(char*)&i,sizeof(int);coutsetw(6)i;/屏幕显示if(j%10=0) coutendl;ifile.seekg(-8,ios:cur);ifile.close();coutendl;正弦函数在0o90o的范围中是单调递增的,建立两个文件:一个放sin0o,sin2o,sin80o;另一个放sin1o,sin3o,sin79o, sin81o,sin82 o,sin90o,用归并法,把这两个数据文件合并为升序排序的文件,重组为一个完整的sin()函数表文件。解:题解中注释掉的直接读写法与使用成员函数结果完全相同,对于类对象,读和写及占据内存

32、大小均指数据成员。主函数中要避免第2次运行时表中出现重复数据。#include#include#include#includeusing namespace std;class sinxdouble Degree;/角度double Value;/正弦值public:sinx(double =0);void display();void Bdatatofile(fstream &); /文件流类作为形式参数必须是引用void Bdatafromfile(fstream &);void datainput(double deg);bool operator=(sinx &);bool opera

33、tor=(sinx &);bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else return false;bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else return false;sinx:sinx(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);void sinx:display()coutsetw(10)

34、Degreesetw(10)Valueendl;void sinx:datainput(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);void sinx:Bdatatofile(fstream & dest)dest.write(char*)&Degree,sizeof(double);dest.write(char*)&Value,sizeof(double);void sinx:Bdatafromfile(fstream & sour)sour.read(char*)&Degree,sizeof(double);sour.rea

35、d(char*)&Value,sizeof(double);/由此可见读和写是完全对称的过程,次序决不能错template class ArrayT *elements;char name20;int Subscript;/已用最大下标值int maxSize;fstream datafile;public:Array(char* =myfile,int=20);Array();bool IsFull() constreturn Subscript=maxSize-1;void renews();/数组扩大一倍void ordinsert(T&);/升序输入void listshow();/显

36、示数组;template Array:Array(char* filename,int maxs)maxSize=maxs;Subscript=-1;/私有数据不容许直接赋初值,必须在构造函数中赋初值strcpy(name,filename);T temp;elements=new TmaxSize;datafile.open(name,ios:binary|ios:in);if(!datafile=0)while(!datafile.eof()temp.Bdatafromfile(datafile);/datafile.read(char*)&temp,sizeof(T);/直接读写法与使用

37、成员函数结果相同if(datafile.eof()=0)/读到无数据可读后,即读入不成功,eofbit为1ordinsert(temp);datafile.close();datafile.clear(0);/采用标准库不可少,前面读到过文件结束或打开文件失败,无法恢复template Array:Array()int i;datafile.open(name,ios:binary|ios:out);for(i=0;i=Subscript;i+)elementsi.Bdatatofile(datafile);/datafile.write(char*)&elementsi,sizeof(T);

38、/直接读写法与使用成员函数结果相同datafile.close();deleteelements;template void Array:renews()int i;T *temp=elements;maxSize*=2;elements=new TmaxSize;for(i=0;i=Subscript;i+) elementsi=tempi;deletetemp;template void Array:ordinsert(T & elem)/以角度为关键字排序int i,j;if(IsFull() renews();for(i=0;i=Subscript;i+) if(elem=i;j-)

39、elementsj+1=elementsj;Subscript+;if(Subscript=-1) Subscript+;/考虑到进入的第一项elementsi=elem;template void Array:listshow()int i;for(i=0;i=Subscript;i+) elementsi.display();/两个文件归并用独立的函数模板template void Merge(char*filename1,char*filename2,char*filename)fstream sdatafile1(filename1,ios:out|ios:in|ios:binary)

40、;fstream sdatafile2(filename2,ios:out|ios:in|ios:binary);fstream ddatafile(filename,ios:out|ios:binary);int i=0,j=0,k=0,ns1,ns2;T temps1,temps2;while(sdatafile1.eof()=0)/侧元素数量,注意会多出一个sdatafile1.read(char*)&temps1,sizeof(T);i+;ns1=i-1;cout表1元素数ns1endl;while(sdatafile2.eof()=0)sdatafile2.read(char*)&t

41、emps2,sizeof(T);j+;ns2=j-1;cout表2元素数ns2endl;sdatafile1.clear(0);/用随机方式,一旦用顺序文件方式访问到结束,就必须清状态sdatafile2.clear(0); i=0;j=0;sdatafile1.seekg(0,ios:beg);sdatafile2.seekg(0,ios:beg);/sdatafile1.read(char*)&temps1,sizeof(T);/此方法与用成员函数完全相同/sdatafile2.read(char*)&temps2,sizeof(T);/对于类对象,读和写及大小均仅指数据成员temps1.

42、Bdatafromfile(sdatafile1);temps2.Bdatafromfile(sdatafile2);while(ins1&jns2)if(temps1=temps2)/ddatafile.write(char*)&temps1,sizeof(T);/sdatafile1.read(char*)&temps1,sizeof(T);temps1.Bdatatofile(ddatafile);temps1.Bdatafromfile(sdatafile1);i+;else/ddatafile.write(char*)&temps2,sizeof(T);/对象读和写及大小均仅指数据成

43、员/sdatafile2.read(char*)&temps2,sizeof(T);/此方法与用成员函数完全相同temps2.Bdatatofile(ddatafile);temps2.Bdatafromfile(sdatafile2);j+;while(ins1)/复制第一个表的剩余元素/ddatafile.write(char*)&temps1,sizeof(T);/sdatafile1.read(char*)&temps1,sizeof(T);temps1.Bdatatofile(ddatafile);temps1.Bdatafromfile(sdatafile1);i+;while(j

44、ns2)/复制第二个表的剩余元素/ddatafile.write(char*)&temps2,sizeof(T);/sdatafile2.read(char*)&temps2,sizeof(T);temps2.Bdatatofile(ddatafile);temps2.Bdatafromfile(sdatafile2);j+;sdatafile1.close();sdatafile2.close();ddatafile.close();int main()sinx temp;int i;/两个正弦表分别在两个块域中定义,域结束时对象存入文件Array mylist(mydata1);cout建

45、立正弦表1(0,2,4,80度)endl;for(i=0;i=80;i=i+2)temp.datainput(i);mylist.ordinsert(temp);/除排序外,同时保证二次进入时不会有重复的表项mylist.listshow();Array mylist(mydata2); cout建立正弦表2(1,3,5,81度;82,83,90)endl;for(i=82;i=90;i+)temp.datainput(i);mylist.ordinsert(temp);for(i=1;i=81;i=i+2)/注意较小的数后入temp.datainput(i);mylist.ordinsert

46、(temp);mylist.listshow(); Merge(mydata1,mydata2,mydata);/按题意要求两个文件归并直接使用文件Array mylist(mydata);cout输出正弦表(0,1,90度)endl;mylist.listshow();return 0;解2:本例未用链表类,但用函数模板。题解中使用的直接读写法与成员函数结果完全相同,对于类对象,读和写及占据内存大小均指数据成员。#include#include#include#includeusing namespace std;class sinxdouble Degree;/角度double Value

47、;/正弦值public:sinx(double =0);void display();void datainput(double deg);bool operator=(sinx &);bool operator=(sinx &);bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else return false;bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else retur

48、n false;sinx:sinx(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);void sinx:display()coutsetw(10)Degreesetw(10)Valueendl;void sinx:datainput(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);template void listshow(T*elements,int subsc)int i;for(i=0;i=subsc;i+) elementsi.display();template

49、void ordinsert(T & elem,T*elements,int subsc)/以角度为关键字排序int i,j;for(i=0;i=subsc-1;i+) if(elem=i;j-) elementsj+1=elementsj;elementsi=elem;template int readfile(char* filename,T*elements)/文件写入链表,返回最大下标int k=-1;T temp;ifstream datafile;datafile.open(filename,ios:binary|ios:in);while(!datafile.eof()dataf

50、ile.read(char*)&temp,sizeof(T); if(datafile.eof()=0)/读到无数据可读后,即读入不成功,eofbit为1k+;ordinsert(temp,elements,k);datafile.close();return k;template void writefile(char* filename,T*elements,int subsc)int i;ofstream datafile;datafile.open(filename,ios:binary|ios:out);for(i=0;i=subsc;i+)datafile.write(char*)

51、&elementsi,sizeof(T);datafile.close();/两个文件归并用独立的函数模板template void Merge(char*filename1,char*filename2,char*filename)fstream sdatafile1(filename1,ios:out|ios:in|ios:binary);fstream sdatafile2(filename2,ios:out|ios:in|ios:binary);fstream ddatafile(filename,ios:out|ios:binary);int i=0,j=0,k=0,ns1,ns2;

52、T temps1,temps2;while(sdatafile1.eof()=0)/求文件所含数据数量sdatafile1.read(char*)&temps1,sizeof(T);i+;ns1=i-1;while(sdatafile2.eof()=0)sdatafile2.read(char*)&temps2,sizeof(T);j+;ns2=j-1;sdatafile1.clear(0);sdatafile2.clear(0); i=0;j=0;sdatafile1.seekg(0,ios:beg);sdatafile2.seekg(0,ios:beg);sdatafile1.read(c

53、har*)&temps1,sizeof(T);/此方法与用成员函数完全相同sdatafile2.read(char*)&temps2,sizeof(T);/对于类对象,读和写及大小均仅指数据成员while(ins1&jns2)if(temps1=temps2)ddatafile.write(char*)&temps1,sizeof(T);sdatafile1.read(char*)&temps1,sizeof(T);i+;elseddatafile.write(char*)&temps2,sizeof(T);/对象读和写及大小均仅指数据成员sdatafile2.read(char*)&temp

54、s2,sizeof(T);/此方法与用成员函数完全相同j+;while(ins1)/复制第一个表的剩余元素ddatafile.write(char*)&temps1,sizeof(T);sdatafile1.read(char*)&temps1,sizeof(T);i+;while(jns2)/复制第二个表的剩余元素ddatafile.write(char*)&temps2,sizeof(T);sdatafile2.read(char*)&temps2,sizeof(T);j+;sdatafile1.close();sdatafile2.close();ddatafile.close();in

55、t main()sinx temp,list1100,list2100,list100;int i,k1,k2,k3;cout建立正弦表1(0,2,4,80度)endl;k1=-1;for(i=0;i=80;i=i+2)temp.datainput(i);k1+;ordinsert(temp,list1,k1);/除排序外,同时保证二次进入时不会有重复的表项writefile(mydata1,list1,k1);temp.datainput(0);for(i=0;i=k1;i+) list1i=temp;/数组清空,以便检验文件k1=readfile(mydata1,list1);/由文件重新

56、写入数组listshow(list1,k1);cout建立正弦表2(1,3,5,81度;82,83,90度)endl;k2=-1;for(i=82;i=90;i+)temp.datainput(i);k2+;ordinsert(temp,list2,k2);for(i=1;i=81;i=i+2)temp.datainput(i);k2+;ordinsert(temp,list2,k2);/除排序外,同时保证二次进入时不会有重复的表项writefile(mydata2,list2,k2);temp.datainput(0);for(i=0;i=k2;i+) list2i=temp;/数组清空,以

57、便检验文件k2=readfile(mydata2,list2);/由文件重新写入数组listshow(list2,k2); Merge(mydata1,mydata2,mydata);/按题意要求两个文件归并直接使用文件cout输出正弦表(0,1,90度)endl;k3=readfile(mydata,list);/由文件重新写入数组listshow(list,k3);return 0;将学校里的学生,定义为一个学生数组类,数组对象动态建立,初始为3个元素,不够用时扩充一倍。要求放在构造函数中用二进制数据文件建立数组元素对象,在析构函数中保存数据和关闭文件。第一次运行时,建立空的数据文件,由键

58、盘输入建立数组元素对象,并写入文件,程序退出时,关闭文件;下一次运行时就可以由文件构造对象,恢复前一次做过的工作。解:#include#include#include#includeusing namespace std;class studentint id ; /学号string name; / 姓名char sex; / 性别int age; / 年龄string address; /家庭地址float eng, phy, math, electron; /英语,物理,数学和电子学成绩public:student(int=0,string=#,char=#,int=0,string=#,

59、float=0,float=0,float=0,float=0);void Bdatatofile(fstream & dest); /数据写入文件流类void Bdatafromfile(fstream & sour); /由文件流类读出数据bool operator=(student &ele)return id=ele.id;bool operator=(student &ele)return id=ele.id;friend ostream&operator(istream&sour,student&st); /重载提取运算符;student:student(int i,string

60、n,char s,int a,string add,float en,float ph,float ma,float ele)id=i;name=n;sex=s;age=a;address=add;eng=en; phy=ph; math=ma; electron=ele;void student:Bdatatofile(fstream & dest) /文件流类作为形式参数必须是引用dest.write(char*)&id,sizeof(int);dest.write(name.c_str(),20);/由string类的c_str()函数转为char*dest.write(char*)&s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论