(本科)第7章输入输出流类库ppt课件.ppt
《(本科)第7章输入输出流类库ppt课件.ppt》由会员分享,可在线阅读,更多相关《(本科)第7章输入输出流类库ppt课件.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程主讲人:第7章 输入输出流类库中国铁道出版社中国铁道出版社张思民等主编张思民等主编C+C+语言程序设计语言程序设计第 7 章 输入输出流类库本章内容本章内容n7.1 流的概念n7.1.1 什么是流n7.1.2 C+流类库n7.1.3 预定义流对象n7.2 重载提取和插入运算符n7.3 常用操作输入输出流的成员函数n7.4 文件n7.4.1 文件的概念n7.4.2 文件的打开与关闭n7.4.3 文本文件的读写操作n7.4.4 二进制文件读写操作n7.4.5 随机访问文件n7.5异常处理n异常的基本类型n异常处理方法n多个异常的处理方法n7.6 命名空间n7.7程序设计实例n本章小结7.1 流
2、的概念7.1.1 什么是流 所所 谓谓 流流(stream),),就是字节的序列。通常把从数据存放地向内存传送数据称为输入流,其操作称为“读操作”。由于流是有方向的,所以只能从输入流中读取数据,而不能向它写数据。如图7.1所示。图7.1从输入流中读取数据到内存 同样,把从内存向数据目的地传送数据称为输出流,其操作称为“写操作”。 输出流只能向该流写入数据,而不能从该流中读取数据。如图7.2所示。图7.2从内存向输出流写数据 流是一个抽象的概念,其职责是在数据的产生者和数据的使用者之间建立联系,并负责管理数据的流动。 7.1.2 C+流类库 C+语言中把对流的描述和对流的操作都定义为类,这些类统
3、称为流类。流类主要由两个流类结构组成,一个是以streambuf 类为基类的类结构层次,另一个是以ios类为基类的类结构层次。其它流类都是从这两个基类派生的,流类已经构成了一个庞大的类库。1、streambuf 类层次结构类层次结构streambuf 类为所有的 streambuf 类层次对象设置了一个固定的内存缓冲区,该内存缓冲区能动态地划分成用做数据输入的读取区和用做数据输出的存放区,这两个区可以重叠也可以不重叠。读取区定义了一个指示当前读取数据位置的读取指针,存放区定义了一个指示当前存放数据位置的存放指针。 filebuf类扩展了streambuf 类的文件处理功能,用于文件流与文件缓冲
4、区相关联,实现对文件缓冲区中的字节序列的读写操作:(1)写文件:将缓冲区的内容按字节写到指定的文件中,然后刷新缓冲区。(2)读文件:交指定文件的内容按字节读到缓冲区中。(3)打开文件:使filebuf对象与被读或写的文件相关联。(4)关闭文件:交filebuf对象与被读或写文件的关联解除。 filebuf类使用文件来保存缓冲区中的字符序列。当写文件时,是把缓冲区中的数据序列写到某个指定文件中;当读文件时,是把某个指定文件中的数据序列读到缓冲区中。2、ios 类层次结构类层次结构ios类是一个抽象类,类是一个抽象类,ios 类层次中各类的含义如表类层次中各类的含义如表7-1所示。所示。 类名含义
5、ios根基类istream输入流类ostream输出流类iostream输入输出流类ifstream输入文件流类ofstream输出文件流类fstream输入输出文件流类istrstream输入字符串流类ostrstream输出字符串流类strstream输入输出字符串流类7.1.3 预定义流对象n在iostream类中定义了4个流对象: cin、cout、cerr、clog。把这4个流对象称为预定义的流对象。这 4 个流对象所关联的具体设备为:ncin 是 istream 的标准输入流对象,用于处理标准输入,与标准输入设备相关联;ncout 是 ostream 的标准输出流对象,用于处理标准
6、输出,与标准输出设备相关联;ncerr 是 ostream 的非缓冲型的标准出错流对象,用于处理标准错误信息,与标准错误输出设备相关联(非缓冲方式)。nclog 是 ostream 的缓冲型标准出错流对象,用于处理标准错误信息,与标准错误输出设备相关联(缓冲方式)。预定义流的含义如表7-2所示。流含义cin对应于标准输入设备(键盘)。cout对应于标准输出设备(显示器)。cerr对应于标准错误输出设备,它是非缓冲输出。clog对应于标准错误输出设备,但它与cerr不同,它的输出是缓冲输出。7.2 重载提取和插入运算符C+流通过重载运算符流通过重载运算符“”执行输入和输出的操作。执行输入和输出的
7、操作。1、预定义的插入运算符在C+中,输出操作称为插入,“”称为插入运算符。在第2章中已经介绍,“”运算符是C+中的逐位左移运算符,在这里,此运算符被重载,用于流的输出操作。预定义的插入运算符“”作用于流对象cout上,用于输出操作。操作格式为:操作格式为:cout cout 操作数;操作数;【例【例7-1】重载插入运算符进行屏幕输出。】重载插入运算符进行屏幕输出。 n#include nusing namespace std;nvoid main()nnint a = 8;nfloat b = 5.5;ndouble c = 78.9;nchar *str = C+确实很神奇确实很神奇!;n
8、cout a = a endl;ncout b = b endl;ncout c = c endl;ncout str = str ”运算符是C+中的逐位右移运算符。在这里,此运算符被重载,用于流的输入操作,称为“提取运算符”。提取运算符“”作用于流对象cin上,用于输入操作。其操作格式为:其操作格式为:cin cin 操作数;操作数;【例【例7-2】重载提取运算符从键盘输入数据。】重载提取运算符从键盘输入数据。n#include nusing namespace std;nvoid main()nnint i;nfloat j;nchar str10;ncout i j;ncout str;
9、ncout i = i endl;ncout j = j endl;ncout str = str endl;n请依次输入一个整数和一个小数: 2 4.5 请输入一个字符串: 面向对象程序设计 i = 2j = 4.5str = 面向对象程序设计7.3 常用操作输入输出流的成员函数1、输出流的成员函数、输出流的成员函数(1)put函数函数该函数把一个字符写到输出流中。这个函数带有一个参数:put(char ch)put(char ch);下面二条语句的作用是相同的:cout.put(a); /向屏幕精确地输出一个字符cout ”很相似,其主要区别是get函数在读取数据时可以包含空白字符,而提取
10、运算符“”是拒绝空白字符的。get函数的原型有三种方式:get();或:get(char ch);或:get(char *buffer, int n, char ch);nget();不带参数,从指定的输入流中提取一个字符。nget(char ch);带一个参数,从输入流中读取一个字符,并存放到变量ch中。nget(char *buffer, int n, char ch);带有三个参数,第一个参数是字符型指针,指向字符串存放区的首地址,第二个参数是字符串的大小,第三个参数为指定的终止符,默认值为“n”。(2)getline函数函数该函数的功能与get(char *buffer, int n,
11、 char ch)相似,允许从输入流中读取多个字符,并且允许指定终止符(默认值是换行符),在完成读取数据后,从读取的数据中删除该终止符。其函数原型为:其函数原型为:getlinegetline(char char * *buffer, int n, char ch = nbuffer, int n, char ch = n););(3)read 函函 数数该函数可以从输入流中每次读取一行字符,其函数原型为:readread(char char * *buffer, int sizebuffer, int size););其中,第一个参数是字符型指针,指向字符序列存入区的首地址,第二个参数是字符
12、序列的总字符数上限。7.4 文 件7.4.1 文件的概念1、文件、文件在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名。一个文件名由文件主名和扩展名两部分组成。文件主名和文件扩展名都是C+的标识符,通常用文件扩展名来区分文件的类型。如在C+系统中,用扩展名.h表示头文件,用扩展名 .cpp 表示程序文件,用 .obj 表示程序文件被编译后生成的目标文件,用 .exe 表示连接整个程序中所有目标文件后生成的可执行文件。对于用户建立的用于保存数据的文件,经常用 .dat 表示扩展名,若是文本文件则也用 .txt 作为扩展名。2、字符文件和字节文件、字符文件和字节文件在C+程序中使用
13、的保存数据的文件按存储格式分为两种类型:一种为字符文件,另一种为字节文件。字符文件又称ASCII码文件或文本文件。在字符文件中,每个字节单元的内容为字符的ASCII码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。字节文件又称为二进制文件。在字节文件中,文件内容是数据的内部表示,是从内存中直接复制过来的。3、文件的读写操作和文件流类型、文件的读写操作和文件流类型无论是字符文件还是字节文件,在访问它之前都要定义一个文件流类的对象,并用该对象打开它,以后对该对象的访问操作就是对被它打开文件的访问操作。对文件操作结束后,再用该对象关闭它。对文件的访问操作包括输入和输出两
14、种操作,输入和输出是相对于CPU来说的,输入操作是指从外部文件读取数据,输出操作是指把内存变量或表达式的值写入到外部文件中。对文件的操作是由文件流类完成的。文件流类在流与文件之间建立连接,使用这些文件流类必须用 #include 编译命令将头文件 fstream 包含进来。文件流分为输入文件流、输出文件流、输入输出文件流三种类型,它们对应的类为:输入流类ifstream;输出流类ofstream;输入输出文件流类fstream。4、文件流对象的文件操作成员函数、文件流对象的文件操作成员函数函数原型操作说明get(char &ch)从文件中读取一个字符getline(char *pch, int
15、 count, char delim = n)从文件中读取多个字符,读取个数由参数count决定,delim为指定读取的结束符,通常是换行符read(char *pch, int count)从文件中读取多个字符,读取个数由count决定put(char ch)向文件写入一个字符write(const char *pch, int count)向文件写入多个字符,字符个数由参数count决定open(const char *filename,int mode)按mode方式打开文件eof( )函数返回值为0,文件中还有数据可读,返回值为非0值(通常为-1),文件指针指向文件末尾gcount(
16、)获得实际读取的字节数seekg(流中的绝对位置);绝对移动,适用于输入流操作seekg(偏移量, 参考位置);相对操作,适用于输入流操作tellg();返回当前指针位置,适用于输入流操作seekp(流中的绝对位置);绝对移动,适用于/输出流操作seekp(偏移量, 参考位置);相对操作,适用于/输出流操作tellp();返回当前指针位置,适用于/输出流操作close( )关闭文件5、文件地址及返回值、文件地址及返回值 一个文件中保存的内容是按字节从数值0开始顺序编址的,文件开始位置的字节地址为0,文件内容的最后一个字节的地址为n-1(假定文件长度为n,即文件中所包含的字节数),文件最后存放的
17、文件结束符的地址为n,它也是该文件的长度值。当一个文件为空时,其开始位置和最后位置(即文件结束符位置)同为0地址位置。 对于每个打开的文件,都存在着一个文件指针,初始指向一个隐含的位置,该位置由具体打开方式决定。每次对文件写入或读出信息都是从当前文件指针所指的位置开始的,当写入或读出若干个字节后,文件指针就后移相应多个字节。当文件指针移动到最后,读出的是文件结束符时,则将使流对象调用eof( )成员函数返回值为-1,当然读出的是文件内容时将返回0。文件结束符占有一个字节,其值为-1,在ios类中把EOF常量定义为-1。若利用字符变量依次读取字符文件中的每个字符,当读取到的字符等于文件结束符EO
18、F时则表示文件访问结束。7.4.2 文件的打开与关闭1、文件的打开、文件的打开n要在程序中对文件进行读写操作,必须先打开文件。只有文件被打开后,才能对文件进行读写操作。打开文件就是使一个文件流对象与一个指定的文件相关联。n打开文件的方法有两种,一种是用文件流对象的成员函数open( )打开文件,另一种是用文件流对象的构造函数打开文件。(1)先建立相应的文件流对象,再用文件流对象的成员函数open( )打开一个文件:由输入流类ifstream建立输入文件流对象。例如:ifstream f_read;由输出流类ofstream建立输出文件流对象。例如:ofstream f_write;输入输出文件
19、流类fstream建立输入输出文件流对象。例如:fstream f_wr;三种文件流类对象都有open( ) 成员函数并且具有完全相同的声明格式,具体声明格式为:具体声明格式为:流类对象名;流类对象名; 对象名对象名.open(文件名文件名, 打开模式打开模式); 其中:其中:流类为ifstream、ofstream或fstream三种流类之一。文件名可以带有盘符和路径名,若省略盘符和路径名则隐含为当前盘和当前路径。(2)通过文件流对象的构造函数打开文件:)通过文件流对象的构造函数打开文件:打开方式用于指定打开文件的模式,对应的实参是ios类中定义的open_mode枚举类型中的符号常量。op
20、en_mode枚举类型中的符号常量含义如表7.4所示。流类对象名流类对象名(文件名文件名, 打开打开模式模式);打开方式含义ios:in 打开用于数据输入的文件,即从文件中读取数据。ios:out 打开用于数据输出的文件,即向文件写入数据。ios:ate 使文件指针移至文件尾,即最后位置。ios:app 使文件指针移至文件尾,并只允许在文件尾部追加数据。ios:trunc 若打开的文件存在,则清除其全部内容,使之变为空文件。ios:binary文件以二进制方式打开,缺省时以文本文件打开。表7.4文件打开模式的符号常量含义 2、文件打开模式、文件打开模式 (1) 文件的打开模式可以为多个符号常量
21、用按位或运算“|”的组合。如: ios:in | ios: binary /按只读方式打开二进制文件。 ios:in | ios:out /按读写操作方式打开文件。 ios:in | ios:out | ios:binary /按读写操作方式打开二进制文件。(2) 使用open()函数打开一个文件时,若所指定的文件不存在,则就新建一个文件,当然新建立的文件是一个长度为0的空文件,但若打开方式参数中包含有ios:in选项,则不建立新文件,并且返回打开失败信息。2、文件打开文件打开模式模式(3) 当打开方式中不包含ios:ate或ios:app选项时,则文件指针被自动移到文件的开始位置,即字节地址
22、为0的位置。当打开方式中包含有ios:out选项,但不包含ios:in、ios:ate或ios:app选项时,若打开的文件存在,则原有内容被清除,使之变为一个空文件。(4) 当用输入文件流对象调用open()函数打开一个文件时,打开方式参数可以省略,缺省按ios:in方式打开,若打开方式参数中不含有ios:in选项时,则会自动被加上。当用输出文件流对象调用open()函数打开一个文件时,打开方式参数也可以省略,缺省按ios:out方式打开,若打开方式参数中不含有ios:out选项时,则也会自动被加上。(1) ofstream f_write; f_write.open(“c:ook.dat”)
23、; (2) ifstream f_read; f_read.open(“c:wr.dat”, ios:in);(3) ofstream f_out; f_out.open(“c:ook.dat”, ios:app);(4) fstream f_wr; f_wr.open(“c:abc.bin”, ios:in | ios:out | ios:binary);下面是定义文件流对象和打开文件的一些示例:对于上述给出的四个例子,可以通过构造函数打开文件,即把声明对象和打开文件合并成一步进行: (1) ofstream f_write(“c:ook.dat”); (2) ifstream f_read
24、(“c:wr.dat”, ios:in); (3) ofstream f_out(“c:ook.dat”, ios:app); (4) fstream f_wr(c:abc.bin”, ios:in | ios:out | ios:binary);3、文件是否成功打开的判断、文件是否成功打开的判断文件打开后,应判断打开是否成功。若不成功,则后续的文件读/写操作就没有实际意义。因在ios类中重载了取反运算符“!”,返回非0值。我们可以利用这一点检测文件打开是否成功。例如,设f_read为输入文件流对象,且调用open( )成员函数打开一个文件,则可用(!f_read)是否为真判断打开文件是否失败
25、。 ifstream f_readifstream f_read;f_read.open(“f_read.open(“文件路径及文件名文件路径及文件名”) );if(!f_read)if(!f_read) exit(1)exit(1); (后续文件操作语句后续文件操作语句) );若文件打开成功,则若文件打开成功,则“! f_read”为为0,否则,否则“! f_read”为为 非非 0 值。值。此处判断条件亦可直接写成:此处判断条件亦可直接写成:f_read.fail( )即即if(f_read.fail( ) exit(1); 4、 文件的关闭文件的关闭关闭任何一个流对象所对应的文件,就用这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科第7章 输入输出流类库ppt课件 本科 输入输出 流类库 ppt 课件
限制150内