1、 第7章 继承与派生 第8章 多态和虚函数 第9章 模板和异常处理 第10章 文件的输入输出 第11章 Visual C+编程基础目录页目录页 Contents page 第1章 绪论 第2章 数据类型和表达式 第3章 控制结构 第4章 复合数据类型 第5章 函数 第12章 MFC应用程序实例 第6章 类与对象 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库学习目标学习目标u 理解函数模板、类模板的概念u 掌握函数模板和类模板的区别及引用u 了解异常的基本概念u 掌握异常处理方法 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识什么是模
2、板?为什么要使用模板?什么是模板?为什么要使用模板?编写编写程序时,经常遇到这样的情况:若干程序单元(如函数或者类定义)中除了所处理的数据程序时,经常遇到这样的情况:若干程序单元(如函数或者类定义)中除了所处理的数据类型不同,程序代码是一样的。例如交换两个变量的值,考虑到需要处理不同的数据类型,所以一类型不同,程序代码是一样的。例如交换两个变量的值,考虑到需要处理不同的数据类型,所以一般采用重载技术。般采用重载技术。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识10.1.1 标准输入和输出标准输入和输出从操作系统的角度看,每一个与主机相连的输入输出设
3、备都被看做一个文件。程序的输入指的从操作系统的角度看,每一个与主机相连的输入输出设备都被看做一个文件。程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C+的输入与的输入与输出主要包括以下的内容:输出主要包括以下的内容:对系统指定的标准设备的输入和输出;对系统指定的标准设备的输入和输出;以外存磁盘文件为对象进行输入和输出;以外存磁盘文件为对象进行输入和输出;对内存指定的空间进行输入和输出对内存指定的空间进行输入和输出。输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。输入和
4、输出是数据传送的过程,数据如流水一样从一处流向另一处。C+形象地将此过程称为形象地将此过程称为流(流(stream)。)。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识10.1.1 标准输入和标准输入和输出输出C+对文件的操作是通过文件流类来实现的,为了使用这些文件流类,需要用对文件的操作是通过文件流类来实现的,为了使用这些文件流类,需要用#include预编译预编译指令将指令将fstream.h文件包含进来。文件流按其用途不同可分为文件包含进来。文件流按其用途不同可分为3种:输入流、输出流和输入输出流。种:输入流、输出流和输入输出流。要在程序中使用
5、它们,必须定义相应的要在程序中使用它们,必须定义相应的对象对象。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识10.1.1 标准输入和标准输入和输出输出表10-1 I/O流类 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识10.1.2 文本流、二进制流和数据文件文本流、二进制流和数据文件数据文件在磁盘上有两种存储方式,一种是按数据文件在磁盘上有两种存储方式,一种是按ASCII码存储,称为码存储,称为ASCII码文件;一种是按二码文件;一种是按二进制码存储,称为二进制文件。进制码存储,称为二进制文件。文本文件
6、文本文件:也称:也称ASCII码文件。这种文件在保存时,每个字符对应一个字节,用于存储对应的码文件。这种文件在保存时,每个字符对应一个字节,用于存储对应的ASCII码。码。二进制二进制文件:不是保存文件:不是保存ASCII码,而是按二进制的编码方式来保存文件内容。码,而是按二进制的编码方式来保存文件内容。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.1 C+文件的基本知识10.1.3 文件的处理方式文件的处理方式C+语言没有提供对文件进行操作的语句,所有的文件操作都是利用语言没有提供对文件进行操作的语句,所有的文件操作都是利用C+语言编译系统所提供语言编译系统所提供的库函
7、数来实现。多数的库函数来实现。多数C+语言编译系统都提供两种文件处理方式,即语言编译系统都提供两种文件处理方式,即“缓冲文件系统缓冲文件系统”和和“非缓非缓冲文件系统冲文件系统”。(1)缓冲文件系统又称为标准文件系统或高层文件系统,是目前常用的文件系统。在对文件进行缓冲文件系统又称为标准文件系统或高层文件系统,是目前常用的文件系统。在对文件进行操作时,系统自动地为每个文件在内存开辟一个缓冲区。操作时,系统自动地为每个文件在内存开辟一个缓冲区。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.2 文件的打开和关闭10.2.1 文件的打开文件的打开1.使用成员函数使用成员函数op
8、en()打开文件打开文件函数函数open()是是ifstream、ofstream和和fstream流类的成员方法,其函数原型为:流类的成员方法,其函数原型为:void open(const char*filename,int mode,int prot=filebuf:openprot);说明说明(1)第一个形参第一个形参filename是要打开的文件名,可以带绝对路径。是要打开的文件名,可以带绝对路径。(2)第二个形参第二个形参mode是文件打开模式,由一些流基类是文件打开模式,由一些流基类ios类的成员说明,取值及含义如表类的成员说明,取值及含义如表10-2所所示示。(3)第三个形参第三
9、个形参prot是文件打开时的保户方式是文件打开时的保户方式,其默认值是其默认值是filebuf:openprot,表示表示“可共享的可共享的”,即该文件可同时被多个文件流对象打开。即该文件可同时被多个文件流对象打开。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.2 文件的打开和关闭10.2.1 文件的打开文件的打开1.使用成员函数使用成员函数open()打开打开文件文件例如,常用的文件打开方式有:例如,常用的文件打开方式有:ios:in/以读方式打开文本文件以读方式打开文本文件ios:in|ios:out/以读以读/写方式打开文本文件写方式打开文本文件ios:in|ios
10、:binary/以读方式打开二进制文件以读方式打开二进制文件ios:in|ios:nocreate /以读方式打开文本文件以读方式打开文本文件,若文件不存在,则打开失败若文件不存在,则打开失败ios:in|ios:binary|ios:nocreate/以读方式打开二进制文件以读方式打开二进制文件,若文件不存在,则打开失败若文件不存在,则打开失败ios:out/以写方式打开文本文件以写方式打开文本文件ios:out|ios:binary/以写方式打开二进制文件以写方式打开二进制文件ios:out|ios:app/以追加方式打开文本文件以追加方式打开文本文件ios:out|ios:app|ios
11、:binary/以追加方式打开二进制文件以追加方式打开二进制文件ios:out|ios:noreplace /以写方式打开文本文件以写方式打开文本文件,若文件存在,则打开失败若文件存在,则打开失败ios:out|ios:binary|ios:noreplace/以写方式打开二进制文件以写方式打开二进制文件,若文件存在,则打开失败若文件存在,则打开失败 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.2 文件的打开和关闭10.2.1 文件的打开文件的打开1.使用成员函数使用成员函数open()打开打开文件文件表10-2 文件打开模式mode的取值 目 录 页第第1010章章C
12、+C+的的I/OI/O流类库流类库10.2 文件的打开和关闭10.2.1 文件的打开文件的打开2使用构造函数打开文件使用构造函数打开文件除了用除了用open()函数进行打开文件外,还可以用三个文件流类函数进行打开文件外,还可以用三个文件流类ifstream、ofstream和和fstream的构造的构造函数在定义对象的同时打开指定文件。函数在定义对象的同时打开指定文件。ifstream:ifstream(const char*filename,int Mode=ios:in,int Prot=filebuf:openprot);ofstream:ifstream(const char*file
13、name,int Mode=ios:in,int Prot=filebuf:openprot);fstream:ifstream(const char*filename,int Mode=ios:in,int Prot=filebuf:openprot);其中,各参数的含义同成员函数其中,各参数的含义同成员函数open()中的参数。中的参数。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.2 文件的打开和关闭10.2.2 文件关闭文件关闭使使用完一个文件后,应使用用完一个文件后,应使用close()函数及时关闭。函数及时关闭。close()函数和函数和open()函数一样,
14、也是文件流类函数一样,也是文件流类的方法。的方法。ofstream outfile(a1.dat,ios:binary);/打开文件打开文件 /其它文件处理语句其它文件处理语句outfile.close();/关闭文件关闭文件 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.3 文件的读写10.3.1 使用流运算符读写文件使用流运算符读写文件由于流插入运算符由于流插入运算符“”都已经在都已经在iostream中重载为能用于中重载为能用于ostream和和istream类对象的输入和输出,而类对象的输入和输出,而ofstream和和ifstream分别是分别是ostream和
15、和istream类的派生类,所以利用类的派生类,所以利用“”可实现对磁盘文件的读写。可实现对磁盘文件的读写。1.整数整数文件的输入和输出文件的输入和输出 2.字符串字符串文件的输入和输出文件的输入和输出 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.3 文件的读写10.3.2 使用流的成员函数读写文件使用流的成员函数读写文件istream流类定义了一些成员函数,用来实现输入的基本功能。而流类定义了一些成员函数,用来实现输入的基本功能。而ostream流类定义了一些成员流类定义了一些成员函数,用来实现输出的基本功能。函数,用来实现输出的基本功能。1常用的输入流成员函数常用的
16、输入流成员函数 get()/返回读取的一个字符返回读取的一个字符 get(char ch)/读取的一个字符存储在读取的一个字符存储在ch中中 getline(char*str,int n,char ch);/读取读取n-1个字符或遇到终止字符个字符或遇到终止字符ch read(char *addr,int size)/读入读入size个字节,存储在首地址个字节,存储在首地址addr的的空间空间2常用的输出流成员函数常用的输出流成员函数 put(char ch)/将将ch中的字符写入到输出流中中的字符写入到输出流中 write(char*addr,int size);/将内存中的一块内容写到输出
17、流将内存中的一块内容写到输出流中中 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.3 文件的读写10.3.3 二进制文件的读写二进制文件的读写二进制文件不同于文本文件,它可以处理各种类型的文件(包含文本文件)。二进制文件的读二进制文件不同于文本文件,它可以处理各种类型的文件(包含文本文件)。二进制文件的读写操作不需要做类似于文本文件的转换,而直接是内存和文件之间的一一映射。写操作不需要做类似于文本文件的转换,而直接是内存和文件之间的一一映射。通常使用通常使用read()和和write()成员函数来处理二进制文件。成员函数来处理二进制文件。1写数据块成员函数写数据块成员函数
18、write()Write()函数的一般形式如下:函数的一般形式如下:write(cost chr*buffer,int size);功能:将一组数据输出到指定的磁盘文件中。功能:将一组数据输出到指定的磁盘文件中。说明说明(1)buffe用于存放输出数据的缓冲区指针,即要写出数据段的起始地址。用于存放输出数据的缓冲区指针,即要写出数据段的起始地址。(2)size是输出的字节数。是输出的字节数。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.3 文件的读写10.3.3 二进制文件的读写二进制文件的读写2读数据块成员函数读数据块成员函数read()read()函数的一般形式如下:
19、函数的一般形式如下:read(char*buffer,int size);功能:从指定的文件中读入一组数据。功能:从指定的文件中读入一组数据。说明说明(1)buffer用于存放读入数据的缓冲区指针,即是存放数据的起始地址。用于存放读入数据的缓冲区指针,即是存放数据的起始地址。(2)size是读入的字节数。是读入的字节数。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.4 文件的随机读写表表10-3 文件流指针相关的成员函数文件流指针相关的成员函数 目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.5 情景应用训练项目10.5.1 项目项目1:C+源文件的编
20、译预处理源文件的编译预处理【问题描述问题描述】编写编写程序完成一种编译预处理工作。将一个程序完成一种编译预处理工作。将一个.cpp源程序文件中的注释语句删除。源程序文件中的注释语句删除。注释注释语句有两种形式:第一种为每行的语句有两种形式:第一种为每行的“/”后面的内容为注释,第二种为在后面的内容为注释,第二种为在“/*”和和“*/”之间之间的内容是注释。的内容是注释。目 录 页第第1010章章C+C+的的I/OI/O流类库流类库10.5 情景应用训练项目10.5.1 项目项目1:C+源文件的编译预处理源文件的编译预处理【算法设计算法设计】将将程序文件程序文件a.cpp看成字符流,读写位置指针
21、从字符流中扫过,舍弃注释,将其他的字符写入看成字符流,读写位置指针从字符流中扫过,舍弃注释,将其他的字符写入b.cpp。读写位置指针有两种状态,当指针在正常语句位置时,为状态。读写位置指针有两种状态,当指针在正常语句位置时,为状态1;当指针在当指针在“/*”和和“*/”之间之间时,为状态时,为状态2。初始时,设定为状态。初始时,设定为状态1。循环读入字符,若读入不成功,退出循环;若读入成功则做。循环读入字符,若读入不成功,退出循环;若读入成功则做如下工作:如下工作:(1)若当前为状态若当前为状态1,则则1)若当前字符为)若当前字符为“/”,其后一个字符为其后一个字符为“*”,则将读写位置指针向
22、后移动,则将读写位置指针向后移动一个字符,并进入状态一个字符,并进入状态2;2)若当前字符为若当前字符为“/”,其后一个字符为其后一个字符为“/”,则将本行其后的所有字符读出,则将本行其后的所有字符读出来(来(n不读出)并舍弃,仍然保持状态不读出)并舍弃,仍然保持状态1;3)否则,将当前字符字符写入文件,仍然保持状态)否则,将当前字符字符写入文件,仍然保持状态1。(2)若当前为状态若当前为状态2,则若当前字符为则若当前字符为“*”,其后一个字符为,其后一个字符为“/”,则将读写位置指针向后移动一,则将读写位置指针向后移动一个字符,进入状态个字符,进入状态1。转入循环开始状态。转入循环开始状态。