第九章答案文件
![第九章答案文件](https://img.360docs.net/img61/02xuqheiyqnyo1k5e4js-11.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.3 练习题解答
1.在C++的输入输出操作中,“流”的概念如何理解?从流的角度说明什么是提取操作?什么是插入操作?
答:C++语言将输入信息和输出信息都看作为信息流,或者是字符流,或者是二进制码流,因此,称为输人流和输出流。输人流是输入的信息流,输出流是输出的信息流。
从“流”的角度来讲,提取操作是从输入信息流中读取信息,将它存放在机器中;插入操作是向输出信息流中加入信息,将它流向某个指定的设备或文件中去。
2.系统预定义的流类对象中,cin和cout的功能是什么?
答:cin是istream类的对象,它表示标准输入流对象,即键盘输入。
cout是ostream类的对象,它表示标准输出流对象,即显示屏幕输出。
3.屏幕输出一个字符串有哪些方法?屏幕输出一个字符有哪些方法?
答:屏幕输出一个字符串通常使用下述方法。
(1)标准输出流对象cout和插入运算符<<。例如,
cout <<”output a string! \n”;
(2)使用成员函数write()输出一个字符串。例如,
cout.write(”string”,strlen(”string”));
屏幕输出一个字符通常也有两种方法。
(1)使用cout和插入运算符<<。
(2)例如。
cout<<’a’<<’,’<<’b’<<endl;
(2)使用成员函数put()输出一个字符。例如,
cout.put(’a“)。put(’,’).put(‘b’).put (’\n’);
4.键盘输入一个字符串有哪些方法?键盘输入一个字符有哪些方法?
答:键盘输入一个字符串通常使用下述方法:
(1)使用标准输入流对象cin和提取符>>。
例如
cin>>a>>b;
(2)使用成员函数read()输入一个字符串。
例如
char s[80]=” "
cin.read(s,80);
(3)使用成员函数getline()输入一行字符串。
例如
char buf[80];
cin.getline(buf,80)5
键盘输入一个字符通常用下述两种方法。
(1)使用cin和提取符>>。
例如
Char cl,c2;
cin>>cl>>c2;
(2)使用成员函数get()输入一个字符。
例如
Char c ;
cin.get(c);
5.如何输出一个int型数值量的不同进位制?
答:输出一个int型数值量的不同进制,可采用下述方法。
例如
int a=123:
输出a的十进制数值:
cout<<dec<<a<<endl:
默认为十进制。
输出a的八进制数值
cout<<oct<<a<<endl;
输出a的十六进制数值
cout<<hex<<a<<endl:
6.如何输出一个浮点数的不同精度?
答:设置浮点数的精度有两种方法。
(1)使用成员函数precision()设置浮点数有效数字的位数。
例如
cout.precision(8);
表明输出浮点数的有效数字位数为8位,不足8位后补0,超过8位四舍五人取8位。
(2)使用操作子set spreci sion(int)设置浮点数精度。
例如
cout<<setsprecision(8)<<1.23456789< 输出结果为1.23456789,不含小数点,共8位。 7.如何确定输出数据项的宽度? 答:确定输出数据项宽度的方法如下: (1)使用成员函数width()确定输出宽度。 例如 cout.Width(10): 表明下面输出的数据项最小宽度为10个字符位置,超过后按实际宽度,不足补填充符。输出宽度设置仅用一次。不设置宽度时按默认宽度0,即按实际宽度输出。 (2)使用操作子setw(int)设置输出数据项宽度。 例如 cout<<setw(10)<<l 23456<<endl; 输出结果为 l 23456,其宽度为10。 8.采用什么方法打开和关闭磁盘文件? 答:打开磁盘文件有下述两种方法。 (1)创建fstream类的对象,打开已知文件,需指出打开方式。例如,以写方式打开 xy.txt文件,具体格式如下所示。 fstream output(”xy.txt”,ios::out); (2)创建ifstream类或ofstream类的对象,只需已知文件名。例如,以读方式打开 xy.txt文件,具体格式如下所示。 ifstrcam input(”xy.txt”); 关闭磁盘文件的方法如下: 使用成员函数close()。 例如 input.close( ); 将创建的inPut输入流对象关闭。 9.写磁盘文件时有哪几种方法? 答:写磁盘文件的方法如下。 (1)使用输出流对象和插入符,可向打开的文件中写入各种类型的数据。 (2)使用输出流对象和成员函数put(),每次向文件中写一个字符。 (3)使用输出流对象和成员函数w rite(),可向文件中写入若干个字符。 10.读磁盘文件时有哪几种方法? 答:读磁盘方法如下所示。 (1)使用输入流对象和提取符(>>),可以从打开的文件中读取各种类型的数据。 (2)使用输入流对象和成员函数get()。每次从打开的文件中读取一个字符。(3)使用输入流对象和成员函数read(),可以从打开的文件中提取一个字符串。 11.如何确定文件的读指针或写指针的位置?如何改变读指针或写指针的位置? 答:c++语言提供了随机访问数据文件的相关操作。由这些操作可以改变读指针和写指针的位置,从而实现随机读写的目地. 一个文件被打开后,由于打开方式不同,读,写指针位置也不同,通常是在文件首,有时。例如.按追加写打开时,写指针会出现在文件民, iostream类提供3个用来改变读指针位置的成数函数c 它们是 istrcam &istrcam::seekg(<流中位置>= istream &istrcam::seekg (<偏移量>,<参照位置>=; streampos istream::tellg(); 其中,<流中位置>和<偏移量>都是long型量,以字节数为单位。<参照位置>含意如下所示。 cur=1 相对当前读指针所指定的位置 beg=0 相对于流的开始位置 end=2 相对于流的结尾处 streampos 被定义为long型量。 例如 input.seekg(—l00,ios::end); 表示使读指针相对文件流尾处前移loo个字节。 成员函数tellg()将返回当前读指针相对于流开始处的字节数。 同样,ostream类中提供了如下3个关于写指针操作的成员函数。 ostream &ostream::seekp((流中位置>); ostream &ostream::seekp(<偏移量=,<参照位置==; streampos ostream::tellp(); 具体解释同上。 l 2.流的错误状态如何处理? 答:在ios类中,定义一个用来记录错误信息的数据成员,称为状态字。该状态字的各位是用不同的错误状态来描述的。 例如 eofbit=Ox01 表示到达文件尾 failbit=Ox02 表示I/O操作失败 等等。 在ios类中又定义了检测流状态字的各种成员函数。 例如 int eof() 该函数返回非零值表示已到文件尾 int fail() 如果faiIbit位被设置,该函数返回非零值。 等等。 利用上述成员函数检测流的错误状态,并进行处理。 9.4 作业题解答 一、选择填空 1.进行文件操作时需要包含( )文件。 A:iostream.h B.fstream.h C. stdio.h D.stdlib.h 答: B。 2.使用操作子对数据进行格式输出时,应包含( )文件。 A. iostream.h B. fstream.h C。 iomanip.h D. stdlib.h 答:C。 3.已知:int a,*pa=&a;输出指针pa十进制的地址值的方法是( )。 A. cout<<pa B. cout<<*pa C.cout<<&pa D.cout<<long(&pa) 答:D。 4.下列输出字符’A’的方法中,( )是错误的。 A.cout<<put(‘A’) B.cout<<’A’ C. cout.put(‘A’) D. char A=’A’;cout<<A 答:A。 5.关于getline()函数的下列描述中,( )是错的。 A.该函数是用来从键盘上读取字符串的 B.该函数读取的字符串长度是受限制的 C.该函数读取字符串时遇到终止符便停止 D.该函数中所使用的终止符只能是换行符 答:D。 6.关于read()函数的下列描述中,( )是对的。 A.该函数只能从键盘输人中获取字符串 B.该函数所获取的字符多少是不受限制的 C.该函数只能用于文本文件的操作中 D.该函数只能按规定读取所指定的字符数 答:B。 7.在ios中提供控制格式的标志位中,( )是转换为十六进制形式的标志位。 A. hex B. oct C. dcc D。1eft 答:A。 8.控制格式输出输入的操作子中,( )是设置域宽的。 A.ws B.oct C.setfill() D,setw() 答:D。 9.磁盘文件操作中,打开磁盘文件的访问方式常量中,( )是以追加方式打开文件的。 A. in B. out C. app D. ate 答:C。 10.下列函数中,( )是对文件进行写操作的。 A.get() B.read() C.seekg() D.put() 答:D。 二、判断下列描述的正确性,对者划√,错者划× √1.使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。 ×2.预定义的插入符从键盘上接收数据是不带缓冲区的。 √3.预定义的提取符和插入符是可以重载的。 ×4.记录流的当前格式化状态的标志字中每一位用于记录一种格式,这种格式是不能被设置或清除的。 √5.设置和清除格式标志字的成员函数需要通过对象来引用它们,输出显示格式的对象通常是cout。 √6.操作子本身是一个对象,它可以直接被提取符或插入符操作。 √7.get()函数不能从流中提取终止字符,终止字符仍留在流中。getline()函数可以从流中提取终止字符,但终止字被丢弃。 ×8.ios类的成员函数clear()是用来清除整个屏幕的。 √9.使用打开文件函数open()之前,需要定义一个流类对象,使用open()函数来操作该对象。 √10.使用关闭文件函数close()关闭一个文件时,但流对象仍存在。 √11.以app方式打开文件时,当前的读指针和写指针都定位于文件尾。 ×12.打开ASCII码流文件和二进制流文件时,打开方式是相同的。 √13.read()和write()函数可以读写文本文件,也可以读写二进制文件。 √14.流的状态包含流的内容、长度和下一次提取或插入操作的当前位置。 ×15.seekg()函数和seekp()函数分别用来定位读指针和写指针的。如果使用 seek()函数可以同时定义读写指针。 三、分析下列程序的输出结果 1 #include<iostream.h> #include<fstream.h> #include<stdlib.h> void main( ) { fstream outfile,infile; outfile.open(“text.dat”,ios::out); if(!outfile) { cout<<”text.dat can’t open.\n”; abort(); } outfile<<”123456789\n”; outfile<<”aaabbbbbbbbccc\n” <<”dddddfffeeeeggggghhh\n”; outfile<<”ok\n”; outfile.close(); infile.open(”tcxt.dat”,ios::in); if(!infile) { cout<<”file can’t open.\n”; abort(); } char textline[80]; While(!infile.eof()) { infile.gctline(textline,sizeof(textline)); cout<<textline<<endl; 运行该程序输出如下结果。 1 2 3 4 5 6 7 8 9 a a a b b b b b b b c c c d d d d d f f f c c c c g g g g g h h h o k! 分析: 该程序中先打开文件text.dat,打开方式是写,判断打开成功后,向该文件中输入行字符串。然后,将该文件关闭。 接着,以读方式打开text.dat文件,判断成功后,将通过while循环语句。逐行读: text.dat文件中的内容,并输出显示在屏幕上。 这里,使用了打开、关闭文件的操作以及对打开文件的读、写操作。 2. #include<iostream.h> #include<fstream.h> #include void main() { fstream file1; file1.open(“text1.dat”,ios::out|ios::in); if(!filel) { cout<<”text1.dat can’t open.\n”; abort(); } char textline[]=”123456789abcdefghijkl.\n”; for(int i=0 ; i file1.seekg(0);// 将读指针移至文件开始 char ch; while(filel.get(ch)) cout<<ch; filel.close( ); } 运行该程序的输出结果如下所示。 1 23456789a b c d e f g h ij k1. 分析: 该程序的特点是打开文件textl.dat时,采用了又写又读的打开方式。打开成功后,先使用写字符函数put(),将字符数组textline[]中的字符串写入该文件。 然后,使用下列语句 filel.seekg(0); 将读指针移至文件开始,接着使用读字符函数get()从文件中读出字符,并显示在屏幕上。 该程序中,对文件textl.dat的读写只打开一次。 #include<strstrea.h> void main() { ostrstream ss: ss<<”Hi,good morning”; ss<<ends: char * buf=ss.str( ); cout<<buf<<endI; de1ete[] buf; } 运行该程序输出结果如下所示。 Hi, good morning! 分析: 程序中首先创建一个ostrstream类的对象ss,ss是一个用来存放插人数据的数组对象。接着,向s s中存人字符串”Hi,g ood morning!”。又增加一个字符串结束符‘\o’,可用end2表示。 程序中又定义—个字符指针.使用ss数组对象的指针值进行初始化,这一功能用成员函数sltr()来实现的。最后。输出显示一个字符串(buf中的字符串)在屏幕上。 4 #include<iostream.h> #include<strstrea.h> char a[]=”1000”; void main() { int dval,oval,hval; istrstream iss(a,sizeof(a)); iss>>dec< iss.seekg(ios::beg); iss>>oct>>oval; iss.seekg(ios::beg); iss>>hex>>hval; cout<<”decVal:”< cout<<”otcVal:”< cout<<”hexVal:”< } 运行该程序输出显示结果如下所示。 decVal:1000 otcval:5l 2 hexval:4096 分析: 程序中定义一个istrstream类的对象iss,先执行下列语句: iss>>dec>>dval; 将字符数组a[]中的字符串,按十进制方式提取后放人变量dVal中,即为十进制数1000 然后,使用seekg()函数将读指针移至字符流开始处,再执行下列语句: iss>>oct>>oval; 将字符数组a[]中字符串,从头开始按八进制提取放入变量oval中,即为olooo,进制为512。接着,同理又将字符数组a[]中字符串,从头按十六进制提取放入变量hval 中,即为ox1000,化为十进制为4096。 最后,输出显示dval,oval和hval值,如上所示。