第12章流类库和输入输出概论
- 格式:docx
- 大小:45.98 KB
- 文档页数:10
C++:流类库与输⼊输出7.2.1 C++的输⼊输出流ios:流基类(抽象类)istream:通⽤输⼊流类和其他输⼊流的基类ostream:通⽤输出流类和其他输出类的基类iostream:通⽤输⼊输出流类和其他输⼊输出流类的基类(以下的派⽣类对象有cin、cout、cerr、clog)ifstream:输⼊⽂件流类ofstream:输出⽂件流类fstream:输⼊输出⽂件流istrstream:输⼊字符串流类ostrstream:输出字符串流类strstream:输⼊输出字符串类iostream_withassign: 通⽤输⼊输出流类和其他输⼊输出流类iostream的的派⽣类7.2.2 预定义的流对象C++中包含⼏个预定义的流对象,它们是标准输⼊流对象cin、标准输出流对象cout、⾮缓冲型的标准出错流对象ceer、缓冲型的标准出错流对象clogcin是istream的派⽣类istream_withassign的对象,它与标准输⼊设备(通常是键盘)相联系。
cout是ostream的派⽣类ostream_withassign的对象,它与标准输出设备(通常是显⽰器)相联系。
ceer是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
clog是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
由于istream和ostream类都在头⽂件iostream中声明的,因此只要在程序中包含头⽂件iostream.h,C++程序开始时这四个标准流对象的构造函数都被⾃动调⽤。
7.2.3 输⼊输出流的成员函数(1)put函数put函数⽤于输出⼀个字符格式:cout.put(char ch)例如:cout.put('A')===cout.put(65)===cout.put(25+40)(2)get函数get函数的功能与提取运算符>>类似,主要不同之处是get函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。
1.概念填空题1.1头文件iostream中定义了4个标准流对象cin,cout,cerr,clog。
其中标准输入流对象为cin,与键盘连用,用于输入;cout为标准输出流对象,与显示器连用,用于输出。
1.2用标准输入流对象cin与提取操作符>>连用进行输入时,将空格与回车当作分隔符,使用get()成员函数进行输入时可以指定输入分隔符。
1.3每一个输入输出流对象都维护一个流格式状态字,用它表示流对象当前的格式状态并控制流的格式。
C++提供了使用格式控制函数与操作子函数来控制流的格式的方法。
1.4 C++根据文件内容的数据格式可分为两类:文本文件和二进制文件。
前者存取的最小信息单位为字节,后者记录。
1.5文件输入是指从文件向内存读入数据;文件输出则指从内存向文件输出数据。
文件的输入输出首先要打开文件;然后进行读写;最后关闭文件。
1.6文本文件是存储ASCII码字符的文件,文本文件的输入可用cin从输入文件流中提取字符实现。
文本文件的输出可用cout将字符插入到输出文件流来实现。
程序在处理文本文件时需要(需要/不需要)对数据进行转换。
1.7二进制文件是指直接将计算机内的数据不经转换直接保存在文件中。
二进制文件的输入输出分别采用read()、write() 成员函数。
这两个成员函数的参数都是2个,分别表示读写缓冲区和字节数。
1.8设定、返回文件读指针位置的函数分别为seekg,tellg;设定、返回文件写指针位置的函数分别为seekp,tellp。
2 简答题2.1 为什么cin输入时,空格和回车无法读入?这时可改用哪些流成员函数?2.2 文件的使用有它的固定格式,试做简单介绍。
2.3 在ios类中定义的文件打开方式中,公有枚举类型open_mode的各成员代表什么文件打开方式?2.4 简述文本文件和二进制文件在存储格式、读写方式等方面的不同,各自的优点和缺点。
2.5 文本文件可以按行也可以按字符进行复制,在使用中为保证能完整复制要注意哪些问题?2.6 文件的随机访问为什么总是用二进制文件,而不用文本文件?2.7 怎样使用istream和ostream的成员函数来实现随机访问文件?3.选择题3.1要进行文件的输出,除了包含头文件iostream外,还要包含头文件(C )。
流类库与输入/输出。
本章主要内容:a)I/O流的概念b)预定义的标准流与提取和插入运算符c)使用I/O成员函数输入流d)文件流2.概述a)输入/输出( input/output ) 是指程序与计算机的外部设备之间进行信息交换。
b)输入操作指从指定设备收取一个字符序列。
c)输出操作将一个对象转换为一个字符序列,输出到某一个设备;d)输入输出操作可以看成是字符序列在源和目的之间的流动。
将执行这个输入/输出操作的类体系称为流类,提供这个流类实现的系统称为流类库。
e)在C++中,没有专门的输入/输出语句,为了方便用户灵活地完成输入/输出,C+提供了功能强大的输入/输出流类库。
f)C++的I/O系统为了向程序员提供一个统一的接口,使程序的设计尽可能地与所访问的具体设备无关,在程序员与被使用的设备之间提供了一个抽象的概念——流。
g)读操作在流数据抽象中被称为(从流中)提取>>,h)写操作被称为(向流中)插入<<。
i)C++语言支持的外部设备是各种各样的,它将各设备都转换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。
对程序员而言,所有流的行为是一样的,所以一个用来进行磁盘文件写入操作的函数,也可以用来向显示器写信息。
3.使用流的优点:(与printf,scanf比较)a)(1)可以用其严格的类型检查机制减少因使用不当引起的程序错误;b)(2)流是面向对象的,可以利用类的继承性和多态性,给用户提供统一的接口,实现更多的功能。
4.C++中的流类体系在头文件“iostream.h”中作了说明。
a)*类ios是类istream和类ostream的虚基类;b)*streambuf不是ios类的派生类,类ios中有一个指c)针成员指向类streambuf的一个对象。
d)*类streambuf是用来管理一个流的缓冲区。
e)*类iostream是类istream和类ostream的公有派生,f)从而通过#include “iostream.h”可以完成输入操作和输出操作。
第12章流类库和输入输出【内容提要】流的概念及流类库输入输出的格式控制输入与输出运算符的重载文件操作【重点与难点】12.1 流的概念及流类库12.1.1 流的概念C++中的流是指数据从一个对象传递到另一个对象的操作。
从流中读取数据称为提取操作,向流内添加数据称为插入操作。
流在使用前要建立,使用后要删除。
如果数据的传递是在设备之间进行,这种流就称为I/O流。
C++专门内置了一些供用户使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。
C++流预定义了4个标准流类对象,它们可以直接用来输入输出。
这些标准流类对象都包含在头文件iostream.h中。
istream cin; //与标准输入设备相关联的标准输入流。
ostream cout; //与标准输出设备相关联的标准输出流。
ostream cerr; //与标准错误输出设备相关联的非缓冲方式的标准输出流。
ostream clog; //与标准错误输出设备相关联的缓冲方式的标准输出流。
12.1.2 流类库C++的流类库有两个平行的基类streambuf和ios,其它的流类都是从这两个基类直接或间接派生的。
使用这些流类库时,必须包含相应的头文件。
ios类及其派生类为用户提供了使用流类的接口。
以下给出ios类及其派生类的层次结构图。
iosistreamifstreamistream_withassign iostreamistrstream fstreamostream strstreamofstream sdiostreamostream_withassignostrstream图12.1 ios类的层次关系12.2 输入输出的格式控制C++仍可使用C中的printf()和scanf()进行格式化控制,同时又提供了两种格式化控制的方法,一是使用ios类中的有关格式控制的成员函数,二是使用执行格式化输入/输出的格式控制符。
12.2.1 用ios类的成员函数进行格式控制使用这种方式进行格式控制主要是通过设置及清除格式状态标志、设置域宽、设置填充字符和设置输出精度的操作来完成的。
设置及清除格式状态标志格式状态标志说明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 格式状态标志是,使状态标志字二进制表示中的不同位为1,它们共同组成状态标志字,存放在数据成员long x_flags中。
在设置格式状态时可以通过按位或(|)运算将多个标志选项组合在一个long int型的值中。
②设置状态标志使用成员函数setf设置参数所指定的格式标志,并返回long int型的标志设置值。
一般调用形式为:流对象.setf(格式状态标志);③清除状态标志使用成员函数unsetf清除指定的标志并返回清除前的标志值。
一般调用形式为:流对象.unsetf(格式状态标志);④取状态标志用成员函数flag,其不带参数时返回格式状态标志的当前设置(long int型值);带参数时按参数指定的格式设置标志,返回以前的标志设置值。
一般调用形式为:流对象.flags();流对象.flags(格式状态标志);注意:flags()与setf()的区别是:setf()是在原有的基础上追加设置,不改变原有设置;flags()使用新的设置覆盖原有的设置,改变了原有设置。
设置域宽域宽是指输出字符的长度。
用成员函数width()完成域宽的设置。
一般调用形式为:流对象.width();流对象.width(int w);说明:①不带参数时返回当前的域宽值;②带参数时将域宽值设置为w,并返回设置前的域宽值。
设置填充字符当输出值长度小于域宽时将剩余部分用设定的填充字符填满,缺省的填充字符为空格。
用成员函数fill设置填充字符。
一般调用形式为:流对象.fill();流对象.fill(char ch);说明:①不带参数时返回当前的填充字符;②带参数时将填充字符设置为ch,并返回设置前的填充字符。
③使用填充字符函数时,必须与设置域宽函数配合使用,否则没有意义。
设置输出精度用函数precision()设置浮点数输出时的显示精度。
一般调用形式为:流对象. precision(int p);12.2.2 用格式控制符进行格式控制预定义的格式控制符(在第二章中已介绍)。
自定义的格式控制符为输出流自定义格式控制符的一般形式为:ostream &格式控制符名(ostream &stream){//自定义代码return stream;}为输入流自定义格式控制符的一般形式为:istream &格式控制符名(istream &stream){//自定义代码return stream;}12.3 输入与输出运算符的重载定义运算符“<<”重载函数的一般形式为:ostream &operator<<(ostream &stream,类名对象名){//操作代码return stream;}定义运算符“>>”重载函数的一般形式为:istream &operator>>(istream &stream,类名&对象名){//操作代码return stream;}说明:重载输入/输出运算符函数只能为非成员函数,一般被定义为类的友元。
12.4 文件操作12.4.1 创建文件流在C++中进行文件操作,要包含<fstream.h>。
该头文件包括了ifstream(从文件输入)、ofstream(向文件输出)、fstream(从文件输入输出)流类的定义。
它们分别派生自istream、ostream、iostream。
建立文件流就是定义文件流类的对象。
如ifstream fin;ofstream fout;fstream fio;建立了流以后,就可以把某一个流与文件建立联系,进行文件的读写操作了。
12.4.2 文件的打开与关闭可以在定义文件流对象的同时完成打开文件的工作,也可在定义文件流对象以后通过open()函数完成。
open()函数是上述三个流类的成员函数,定义在fstream.h头文件中。
函数原型为:void open(const unsigned char *,int mode,int dcces=filebuf::openprot);说明:①第一个参数用来传递文件名;②第二个参数的值决定文件打开的方式,必须从下列值中选取:ios::app //使输出追加到文件尾部,只用于输出ios::ate //查找文件尾ios::in //打开一个文件进行读操作,只用于输入ios::nocreate //文件不存在,导致open()失败ios::noreplace //若文件存在,则open()失败ios::out //打开一个文件进行写操作,只用于输出ios::trunc //删除同名文件ios::binary //以二进制方式打开文件,缺省为文本方式以上各值可以组合使用,之间用“|”分开。
③第三个参数的值决定文件的访问方式及文件的类别。
一般情况下,ifstream和ofstream流类的析构函数就可以自动关闭已打开的文件,也可用函数close()关闭文件,它是流类中的成员函数,没有参数,没有发返回值。
12.4.3 文件的读写文件的顺序读写①get()函数函数原型:istream &get(unsigned char &ch);作用:它从流中每次读出一个字节或一个字符放入引用ch&中。
②put()函数函数原型:istream &put( char ch);作用:它将一个字节或一个字符写入流中。
③read()函数函数原型:istream &read(unsigned char *buf,int num);作用:从相应的流读出num个字节或字符的数据,把他们放入指针所指向的缓冲区中。
buf是一个指向读入数据存放空间的指针,num说明要读入数据的字节或字符数。
④write()函数函数原型:ostream &write(const unsigned char *buf,int num);作用:从buf所指向的缓冲区把num个字节的数据写到相应的流中。
参数的含义、调用及注意事项与read()相同。
文件的随机读写完成定位操作的函数如下:①函数seekg()函数原型:isream &seekg(streamoff offset,seek_dir origin);作用:用于输入文件,将文件的读指针从origin说明的位置移动offset个字节;②函数seekp()函数原型:osream &seekp(streamoff offset,seek_dir origin);作用:用于输出文件,将文件的写指针从origin说明的位置移动offset个字节。
说明:origin的取值由三种情况:ios::beg 从文件头开始,把文件指针移动由offset指定的距离。
ios::cur 从文件当前位置开始,把文件指针移动offset指定的距离。
ios::end 从文件尾开始,把文件指针移动由offset指定的距离。
③函数tellg()函数原型:streampos tellg();作用:用于输入文件,确定文件当前指针的位置④函数tellp()函数原型:streampos tellp();作用:用于输出文件,确定文件当前指针的位置。
【典型例题】例题1.在C++中,打开一个文件就是将一个文件与一个_________建立关联;关闭一个文件就是取消这种关联。
解答:C++的I/O系统是通过一种称为流的机制来实现文件和控制台的I/O操作。