第12章 流类库和输入输出.docx
- 文档编号:12702218
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:23
- 大小:42.70KB
第12章 流类库和输入输出.docx
《第12章 流类库和输入输出.docx》由会员分享,可在线阅读,更多相关《第12章 流类库和输入输出.docx(23页珍藏版)》请在冰豆网上搜索。
第12章流类库和输入输出
第12章流类库和输入输出
【内容提要】
流的概念及流类库
输入输出的格式控制
输入与输出运算符的重载
文件操作
【重点与难点】
12.1流的概念及流类库
12.1.1流的概念
C++中的流是指数据从一个对象传递到另一个对象的操作。
从流中读取数据称为提取操作,向流内添加数据称为插入操作。
流在使用前要建立,使用后要删除。
如果数据的传递是在设备之间进行,这种流就称为I/O流。
C++专门内置了一些供用户使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。
C++流预定义了4个标准流类对象,它们可以直接用来输入输出。
这些标准流类对象都包含在头文件iostream.h中。
istreamcin;//与标准输入设备相关联的标准输入流。
ostreamcout;//与标准输出设备相关联的标准输出流。
ostreamcerr;//与标准错误输出设备相关联的非缓冲方式的标准输出流。
ostreamclog;//与标准错误输出设备相关联的缓冲方式的标准输出流。
12.1.2流类库
C++的流类库有两个平行的基类streambuf和ios,其它的流类都是从这两个基类直接或间接派生的。
使用这些流类库时,必须包含相应的头文件。
ios类及其派生类为用户提供了使用流类的接口。
以下给出ios类及其派生类的层次结构图。
ios
istream
ifstream
istream_withassigniostream
istrstreamfstream
ostreamstrstream
ofstreamsdiostream
ostream_withassign
ostrstream
图12.1ios类的层次关系
12.2输入输出的格式控制
C++仍可使用C中的printf()和scanf()进行格式化控制,同时又提供了两种格式化控制的方法,一是使用ios类中的有关格式控制的成员函数,二是使用执行格式化输入/输出的格式控制符。
12.2.1用ios类的成员函数进行格式控制
使用这种方式进行格式控制主要是通过设置及清除格式状态标志、设置域宽、设置填充字符和设置输出精度的操作来完成的。
设置及清除格式状态标志
1格式状态标志
格式状态标志
说明
ios:
:
skipws
跳过输入中的空白,用于输入
ios:
:
left
左对齐输出,用于输出
ios:
:
right
右对齐输出,用于输出
ios:
:
internal
在符号和数值之间填充字符,用于输出
ios:
:
dec
转换基数为十进制,用于输入或输出
ios:
:
oct
转换基数为八进制,用于输入或输出
ios:
:
hex
转换基数为十六进制,用于输入或输出
ios:
:
showbase
输出时显示基指示符(0表示八进制,0x或0X表示十六进制),用于输入或输出
ios:
:
showpoint
输出时显示小数点,用于输出
ios:
:
uppercase
输出时表示十六进制的x为大写,表示浮点数科学计数法的e为大写,用于输出
ios:
:
showpos
正整数前显示“+”符号,用于输出
ios:
:
scientific
用科学表示法显示浮点数,用于输出
ios:
:
fixed
用定点形式显示浮点数,用于输出
ios:
:
unitbuf
在输出操作后立即刷新所有流,用于输出
ios:
:
stdio
在输出操作后刷新stdout和stderr,用于输出
图12.2格式状态标志
图12.2中的格式状态标志在类ios中被定义为枚举值,这些枚举元素的值的共同特点是,使状态标志字二进制表示中的不同位为1,它们共同组成状态标志字,存放在数据成员longx_flags中。
在设置格式状态时可以通过按位或(|)运算将多个标志选项组合在一个longint型的值中。
2设置状态标志
使用成员函数setf设置参数所指定的格式标志,并返回longint型的标志设置值。
一般调用形式为:
流对象.setf(格式状态标志);
3清除状态标志
使用成员函数unsetf清除指定的标志并返回清除前的标志值。
一般调用形式为:
流对象.unsetf(格式状态标志);
4取状态标志
用成员函数flag,其不带参数时返回格式状态标志的当前设置(longint型值);带参数时按参数指定的格式设置标志,返回以前的标志设置值。
一般调用形式为:
流对象.flags();
流对象.flags(格式状态标志);
注意:
flags()与setf()的区别是:
setf()是在原有的基础上追加设置,不改变原有设置;flags()使用新的设置覆盖原有的设置,改变了原有设置。
设置域宽
域宽是指输出字符的长度。
用成员函数width()完成域宽的设置。
一般调用形式为:
流对象.width();
流对象.width(intw);
说明:
5不带参数时返回当前的域宽值;
6带参数时将域宽值设置为w,并返回设置前的域宽值。
设置填充字符
当输出值长度小于域宽时将剩余部分用设定的填充字符填满,缺省的填充字符为空格。
用成员函数fill设置填充字符。
一般调用形式为:
流对象.fill();
流对象.fill(charch);
说明:
7不带参数时返回当前的填充字符;
8带参数时将填充字符设置为ch,并返回设置前的填充字符。
9使用填充字符函数时,必须与设置域宽函数配合使用,否则没有意义。
设置输出精度
用函数precision()设置浮点数输出时的显示精度。
一般调用形式为:
流对象.precision(intp);
12.2.2用格式控制符进行格式控制
预定义的格式控制符(在第二章中已介绍)。
自定义的格式控制符
为输出流自定义格式控制符的一般形式为:
ostream&格式控制符名(ostream&stream)
{
//自定义代码
returnstream;
}
为输入流自定义格式控制符的一般形式为:
istream&格式控制符名(istream&stream)
{
//自定义代码
returnstream;
}
12.3输入与输出运算符的重载
定义运算符“<<”重载函数的一般形式为:
ostream&operator<<(ostream&stream,类名对象名)
{
//操作代码
returnstream;
}
定义运算符“>>”重载函数的一般形式为:
istream&operator>>(istream&stream,类名&对象名)
{
//操作代码
returnstream;
}
说明:
重载输入/输出运算符函数只能为非成员函数,一般被定义为类的友元。
12.4文件操作
12.4.1创建文件流
在C++中进行文件操作,要包含
该头文件包括了ifstream(从文件输入)、ofstream(向文件输出)、fstream(从文件输入输出)流类的定义。
它们分别派生自istream、ostream、iostream。
建立文件流就是定义文件流类的对象。
如
ifstreamfin;
ofstreamfout;
fstreamfio;
建立了流以后,就可以把某一个流与文件建立联系,进行文件的读写操作了。
12.4.2文件的打开与关闭
可以在定义文件流对象的同时完成打开文件的工作,也可在定义文件流对象以后通过open()函数完成。
open()函数是上述三个流类的成员函数,定义在fstream.h头文件中。
函数原型为:
voidopen(constunsignedchar*,intmode,intdcces=filebuf:
:
openprot);
说明:
1第一个参数用来传递文件名;
2第二个参数的值决定文件打开的方式,必须从下列值中选取:
ios:
:
app//使输出追加到文件尾部,只用于输出
ios:
:
ate//查找文件尾
ios:
:
in//打开一个文件进行读操作,只用于输入
ios:
:
nocreate//文件不存在,导致open()失败
ios:
:
noreplace//若文件存在,则open()失败
ios:
:
out//打开一个文件进行写操作,只用于输出
ios:
:
trunc//删除同名文件
ios:
:
binary//以二进制方式打开文件,缺省为文本方式
以上各值可以组合使用,之间用“|”分开。
3第三个参数的值决定文件的访问方式及文件的类别。
一般情况下,ifstream和ofstream流类的析构函数就可以自动关闭已打开的文件,也可用函数close()关闭文件,它是流类中的成员函数,没有参数,没有发返回值。
12.4.3文件的读写
文件的顺序读写
1get()函数
函数原型:
istream&get(unsignedchar&ch);
作用:
它从流中每次读出一个字节或一个字符放入引用ch&中。
2put()函数
函数原型:
istream&put(charch);
作用:
它将一个字节或一个字符写入流中。
3read()函数
函数原型:
istream&read(unsignedchar*buf,intnum);
作用:
从相应的流读出num个字节或字符的数据,把他们放入指针所指向的缓冲区中。
buf是一个指向读入数据存放空间的指针,num说明要读入数据的字节或字符数。
4write()函数
函数原型:
ostream&write(constunsignedchar*buf,intnum);
作用:
从buf所指向的缓冲区把num个字节的数据写到相应的流中。
参数的含义、调用及注意事项与read()相同。
文件的随机读写
完成定位操作的函数如下:
1函数seekg()
函数原型:
isream&seekg(streamoffoffset,seek_dirorigin);
作用:
用于输入文件,将文件的读指针从origin说明的位置移动offset个字节;
2函数seekp()
函数原型:
osream&seekp(streamoffoffset,seek_dirorigin);
作用:
用于输出文件,将文件的写指针从origin说明的位置移动offset个字节。
说明:
origin的取值由三种情况:
ios:
:
beg从文件头开始,把文件指针移动由offset指定的距离。
ios:
:
cur从文件当前位置开始,把文件指针移动offset指定的距离。
ios:
:
end从文件尾开始,把文件指针移动由offset指定的距离。
3函数tellg()
函数原型:
streampostellg();
作用:
用于输入文件,确定文件当前指针的位置
4函数tellp()
函数原型:
streampostellp();
作用:
用于输出文件,确定文件当前指针的位置。
【典型例题】
例题1.在C++中,打开一个文件就是将一个文件与一个_________建立关联;关闭一个文件就是取消这种关联。
解答:
C++的I/O系统是通过一种称为流的机制来实现文件和控制台的I/O操作。
简单地说,在C++中,输入输出操作是通过流来完成的。
而文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。
每个文件流都应当与一个打开的文件相联系;关闭一个文件就是取消这种联系。
答案为:
流。
例题2.进行外交操作时需要包含()头文件。
(a)iostream(b)fstream(c)stdio(d)stdlib
解答:
文件流是文件流类的实例对象。
C++系统在头文件fstream中定义了3个文件流类:
ifstream,ofstream和fstream。
要创建文件流,必须包含头文件fstream。
并声明所创建的文件流是上述哪个类的实例对象。
因此,有关文件I/O类的说明包含在fstream头文件中。
答案为:
b。
例题3.当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为()。
(a)ios:
:
in(b)ios:
:
out(c)ios:
:
trunc(d)ios:
:
binary
解答:
当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为ios:
:
in;当使用ofstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为ios:
:
out。
答案为:
a。
例题4.下列函数中,()是对文件进行写操作的。
(a)read()(b)seekg()(c)get()(d)put()
解答:
read()的功能是输入指定数量的字节存入指定的字符空间中;seekg()的功能是按指定方式将输入定位于指定的相对位置处;get()的功能是提取并返回当前输入位置的字符代码,或将提取的字符存入指定变量中;put()的功能是把一个字符写到输出流中。
答案为:
d。
例题5.cin是__________的一个对象,处理标准输入。
cout,cerr和clog是________的对象,cout处理标准输出,cerr和clog都处理标准出错信息,只是________输出不带缓冲,________输出带缓冲。
解答:
C++流预定义了4个流,它们是cin,cout,cerr和clog。
它们可以直接用来输入输出,与这4个流所联结起的具体设备是:
(1)cin:
与标准输入设备相关联。
(2)cout:
与标准输出设备相关联。
(3)cerr:
与标准错误输出设备相关联(非缓冲)。
(4)clog:
与标准错误输出设备相关联(缓冲)。
因此,可知cin是istream的一个对象,处理标准输入。
cout,cerr和clog是ostream的对象,cout处理标准输出,cerr和clog都处理标准出错信息,只是cerr输出不带缓冲,clog输出带缓冲。
答案为:
istream、ostream、cerr、clog。
例题6.下面是一个将文本文件readme中的内容读出并显示在屏幕上的示例,请完成该程序。
#include
voidmain()
{
charbuf[80];
ifstreamme(“c:
\\readme”);
while(____①_____)
{
me.getline(____②_____,80);
cout< } me.close(); } 解答: while循环中需要加循环终止条件,在①处应该判断文件是否结束,应填入“! me.eof()”;根据getline()函数的原型可知,此处应填入一个字符串变量,故填入“buf”。 即答案为: ①! me.eof()、②buf。 例题7.下面的程序向C盘的new文件写入内容,然后把该内容显示出来,试完成该程序。 #include voidmain() { charstr[100]; fstreamf; ___________①_________; f<<”helloworld”; f.put(‘\n’); f.seekg(0); while(_____②_________) { f.getline(str,100);cout< } ______③___________; } 解答: 向文件写内容前首先需要打开该文件并指明需要的输入输出操作;在使用完毕后应当关闭该文件。 在读到文件结尾时应当结束读取操作。 故本题答案为: ①f.open(“c: \\new”,ios: : in|ios: : out)、②! f.eof()、③f.close()。 例题8.运行下列程序结果为()。 #include #include voidmain() { inta=12; doubleb=314159.26;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第12章 流类库和输入输出 12 流类库 输入输出