第九章答案文件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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值,如上所示。

相关文档
最新文档