C++第九章习题解答.docx
- 文档编号:7103069
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:39
- 大小:33.29KB
C++第九章习题解答.docx
《C++第九章习题解答.docx》由会员分享,可在线阅读,更多相关《C++第九章习题解答.docx(39页珍藏版)》请在冰豆网上搜索。
C+第九章习题解答第九章习题解答第九章流类库和输入/输出习题一.本概念与基础知识测试题9.1填空题9.1.1在C+中“流”是表示
(1)。
从流中取得数据称为
(2),用符号(3)表示;向流中添加数据称为(4),用符号(5)表示。
答案:
(1)数据从一个对象到另一个对象的传送
(2)提取操作(3)(4)插入操作(5)(stream_extractionoperator)(6)”)运算符在缺省情况下是跳过空白(包括空格,制表,backspace和回车等)的,这样拷贝的文件会缺少一些字符。
第二,该程序应能确定文件是否拷贝结束。
按行进行拷贝,getline()回车换行符并不放在buf中,因此要加一个回车换行符。
9.2.9对文件流,“!
”运算符完成什么功能?
答:
返回状态字state操作非法和操作失败这两位。
9.2.10二进制文件读函数read()能否知道文件是否结束?
应怎样判断文件结束?
答:
读函数并不能知道文件是否结束,可用状态函数intios:
eof()来判断文件是否结束。
必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断本次操作是否有效。
9.2.11由二进制文件和文本文件来保存对象各有什么优点和缺点?
答:
使用二进制文件,可以控制字节长度,读写数据时不会出现二义性,可靠性高。
同时不知格式是无法读取的,保密性好。
文件结束后,系统不会再读(见eofbit的说明),但程序不会自动停下来,所以要判断文件中是否已没有数据。
使用文本文件来保存对象,操作简单,但谁都可以读取这些数据,无保密性。
9.2.12文件的随机访问为什么总是用二进制文件,而不用文本文件?
答:
在C+中可以由程序来实现文件指针的移动,从而实现文件的随机访问,即可读写流中任意一段内容。
一般文本文件很难准确定位,所以随机访问多用于二进制文件。
9.2.13怎样使用istream和ostream的成员函数来实现随机访问文件?
答:
在ios类中说明了一个公有枚举类型:
enumseek_dirbeg=0,/文件开头cur=1,/文件指针的当前位置end=2/文件结尾;istream类中提供了如下三个成员函数:
istream&istream:
seekg(streampos);/指针直接定位istream&istream:
seekg(streamoff,ios:
seek_dir);/指针相对定位longistream:
tellg();/返回当前指针位置seekg(streamoff,ios:
seek_dir)应用最广,如:
datafile.seekg(-20L,ios:
cur);表示将文件定位指针从当前位置向文件头部方向移20个字节。
datafile.seekg(20L,ios:
beg);表示将文件定位指针从文件头向文件尾方向移20个字节。
datafile.seekg(-20L,ios:
end);表示将文件定位指针从文件尾向文件头方向移20个字节。
tellg()和seekg()往往配合使用。
ostream类也提供了三个成员函数管理文件定位指针,它们是:
ostream&ostream:
seekp(streampos);ostream&ostream:
seekp(streamoff,ios:
seek_dir);longostream:
tellp();定位指针只有一个但函数有两组,这两组个函数功能完全一样。
二.编程与综合练习题9.3编程实现以下数据输入输出:
a)以左对齐方式输出整数,域宽为12;b)以八进制、十进制、十六进制输入输出整数;c)实现浮点数的指数格式和定点格式的输入输出,并指定精度;d)把字符串读入字符型数组变量中,从键盘输入,要求输入串的空格也全部读入,以回车换行符结束;e)以上要求用流成员函数和流操作子各做一遍。
解:
特别注意flags()和setf()的使用方法。
注意注释。
#include#includeusingnamespacestd;intmain(void)intinum1=255,inum2=8191,inum3=65535;doublefnum=31.415926535,fnum1;charstr255;cout以左对齐方式输出整数,域宽为12:
endl;cout.flags(ios:
left);cout.width(12);coutinum1;cout.width(12);coutinum2;cout.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);/特别注意第二个参数要包含第一个参数,否则两个参数位置上的位全清零,结果错cout.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.precision(10);/精度为10位,小数点后10位cout.setf(ios:
scientific,ios:
floatfield);/floatfield为0x1800cout科学数表达方式:
fnumn;cout.setf(ios:
fixed,ios:
floatfield);/设为定点,取消科学数方式cout定点表达方式:
fnumn;cout请输入PI:
fnum1;/输入3.1415926535coutfnum1n;/由输出看输入精度无作用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(12)inum3endl;coutsetprecision(10)scientific科学数表达方式:
fnumn;coutfixed定点表达方式:
fnumn;/精度10位,指小数点后10位return0;9.4修改【例9.3】,增加一个字符串输入后要求确认,以保证输入的字符串(如姓名、地址等)无误。
解:
#includeusingnamespacestd;intmain(void)charch,str255;docout请输入一个字符串:
endl;cin.getline(str,255);coutstrendl;cout输入正确吗?
YorNch;cin.get();/吸收输入YorN时留下的回车while(!
(ch=Y|ch=y);cout输入正确:
endl;coutstrendl;return0;9.5重载学生类的“”运算符。
#include#include#include#includeusingnamespacestd;classstudentintid;/学号stringname;/姓名charsex;/性别intage;/年龄stringaddress;/家庭地址floateng,phy,math,electron;/英语,物理,数学和电子学成绩public:
student(int=0,string=#,char=#,int=0,string=#,float=0,float=0,float=0,float=0);friendostream&operator(istream&sour,student&st);/重载提取运算符;/流类作为形式参数必须是引用student:
student(inti,stringn,chars,inta,stringadd,floaten,floatph,floatma,floatele)id=i;name=n;sex=s;age=a;address=add;eng=en;phy=ph;math=ma;electron=ele;ostream&operator(ostream&dest,student&st)/重载插入运算符destst.idtst.nametst.sextst.agetst.addresstst.engtst.phytst.mathtst.electron(istream&sour,student&st)/重载提取运算符cout请输入学号:
st.id;cout请输入姓名:
st.name;cout请输入性别:
st.sex;cout请输入年龄:
st.age;cout请输入地址:
st.address;cout请输入英语、物理、数学、电子各科成绩:
st.engst.physt.mathst.electron;returnsour;intmain()studentst1,st2(2104105,陈英,m,19,黄山路380号,89,78,90,96);cinst1;coutst1”运算符,对所有可能的错误都能要求重输。
解:
#includeusingnamespacestd;classComplexdoubleReal,Image;public:
Complex(doubler=0.0,doublei=0.0):
Real(r),Image(i);/定义构造函数/见【例5.7】,这里省略,以节约篇幅friendostream&operator(istream&s,Complex&a);/流类作为形式参数必须是引用ostream&operator(ostream&s,constComplex&z)returns(z.Real,z.Image(istream&s,Complex&a)/格式为r;r,i;(r);(r,i);整个复数输完才可回车/容错强,如:
sd(fr56cv,s79nml,45)i,78回车可正确判读为(56,79)doublere=0,im=0;charc=0;dosc;while(c!
=(&c!
=.&!
(c=0&cc;while(c!
=.&!
(c=0&cre;/实部dos.get(c);/因为可能是回车while(c!
=n&c!
=)&c!
=,);/读空数字串后的无用字符if(c=,)do/只读数字串sc;while(c!
=.&!
(c=0&cim;/虚部dos.get(c);/因为可能是回车while(c!
=n&c!
=);/读空数字串后的无用字符elseim=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!
=n);/读空数字串后的无用字符elseim=0;/无此步,第二次赋值出错if(s)a=Complex(re,im);returns;intmain()Complexa,b,c,d;cout输入一个实数a;cout输入一个复数b;cout输入一个用括号括起来的实数c;cout输入一个用括号括起来复数d;couta=atb=btc=ctd=dn;return0;9.7以文本方式把一个文本文件(如+源文件)的前十行拷贝到一个新的文件中。
解:
注意只能用于纯文本文件,如用于word文件则失败。
word文档构造前面有一大堆说明,按文本读必然失败。
第二,用传统的运行库,按行读有可能丢失一些回车,而用新的标准库则解决了这个问题。
用VC+标准库函数,即用头文件iostream时,如果函数未能读到结束字符而停止,流出错(输入输出操作失败),后面不再读入,必须清0流状态字,才能继续读入。
一行字符分几次读完,原来有可能无法判断是读到结束字符结束还是读到指定字符结束,现在可以判断了:
如果流正常,则读到了结束字符。
#include#include/不包含#includeusingnamespacestd;intmain()intline=0;charfilename256,buf256;fstreamsfile,dfile;cout输入源文件路径名:
filename;/对路径各方面而言空格是无关紧要的,否则要用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;return1;while(sfile.getline(buf,256),sfile.eof()!
=1&line10)/按行拷贝A行if(sfile.rdstate()=0)dfilebufn;/因流正常,读到回车符,但未提取B行line+;elsedfilebuf;/流不正常,还未读到回车换行符,所以不加nsfile.clear();/状态字被置为0x02,必须清0sfile.close();dfile.close();return0;9.8用二进制方式,把一个文件连接到另一个文件的尾部,选择适当的文件打开方式完成。
解:
注意连接只能用于纯文本文件,如用于word文件则失败。
如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。
因为word文档构造前面有一大堆说明,真正连接时,后面的源文件前面的说明要去掉,但这做不到。
#include#include#includeusingnamespacestd;intmain()intn;charfilename256,buf100;fstreamsfile,dfile;cout输入源文件路径名:
filename;/对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数sfile.open(filename,ios:
in|ios:
binary);/打开一个已存在的二进制文件while(!
sfile)cout源文件找不到,请重新输入路径名:
filename;sfile.open(filename,ios:
in|ios:
binary);cout输入目标文件路径名:
filename;/只能创建文件,不能建立子目录,如路径不存在则失败dfile.open(filename,ios:
app|ios:
out|ios:
binary);/文件指针在尾部if(!
dfile)cout目标文件创建失败endl;return1;while(!
sfile.eof()/二进制方式需另判文件是否结束Asfile.read(buf,100);n=sfile.gcount();dfile.write(buf,n);/按实际读取字节数写sfile.close();dfile.close();return0;9.9同上题,采用重新定位文件指针方式来实现(随机访问方式)。
解:
同样连接只能用于纯文本文件,如用于word文件则失败。
如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。
因为word文档构造前面有一大堆说明,真正链接时,后面的源文件前面的说明要去掉,但这做不到。
#include#include#includeusingnamespacestd;intmain()intn;charfilename256,buf100;fstreamsfile,dfile;cout输入源文件路径名:
filename;/对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数sfile.open(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.close();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();return0;9.10采用筛选法求100以内的所有素数(参见【例3.16】)。
将所得数据存入文本文件和二进制文件。
对送入文本文件中的素数,要求存放格式是每行10个素数,每个数占6个字符,左对齐;可用任一文本编辑器将它打开阅读。
二进制文件整型数的长度请用sizeof()来获得,要求可以正序读出,也可以逆序读出(利用文件定位指针移动实现),读出数据按文本文件中的格式输出显示。
解:
前半题文本文件与习题3.17相同,只是那里是右对齐,这里只新做了二进制文件。
注意逆序输出前,试读看有多少数据时,一旦读到文件结束,eofbit=1,不清0,后面操作不能进行。
#include#include#includeconstintn=100;voidmain()ofstreamofile;ifstreamifile;intan,i,j;charch,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);intcount=0;ofile.flags(ios:
left);ofile1-n之间的素数:
endl;for(i=0;in;i+)/输出所有素数if(ai!
=0)ofilesetw(6)ai;count+;if(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();coutendl;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;/屏幕显示count+;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+)ifile.read(char*)&i,sizeof(int);coutsetw(6)i;/屏幕显示if(j%10=0)coutendl;ifile.seekg(-8,ios:
cur);ifile.close();coutendl;9.11正弦函数在0o90o的范围中是单调递增的,建立两个文件:
一个放sin0o,sin2o,sin80o;另一个放sin1o,sin3o,sin79o,sin81o,sin82o,sin90o,用归并法,把这两个数据文件合并为升序排序的文件,重组为一个完整的sin()函数表文件。
解:
题解中注释掉的直接读写法与使用成员函数结果完全相同,对于类对象,读和写及占据内存大小均指数据成员。
主函数中要避免第2次运行时表中出现重复数据。
#include#include#include#includeusingnamespacestd;classsinxdoubleDegree;/角度doubleValue;/正弦值public:
sinx(double=0);voiddisplay();voidBdatatofile(fstream&);/文件流类作为形式参数必须是引用voidBdatafromfile(fstream&);voiddatainput(doubledeg);booloperator=(sinx&);booloperator=(sinx&);boolsinx:
operator=(sinx&si)doublek;k=Degree-si.Degree;if(k=0)returntrue;elsereturnfalse;boolsinx:
operator=(sinx&si)doublek;k=Degree-si.Degree;if(k=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 第九 习题 解答