C++大学基础教程 第12章 I/O流及输入输出 北京邮电大学电信工程学院 计算机技术中心 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -2- C++语言没有输入/输出语句,但 C++编译系统带有一个面向对象 的输入/输出软件包,它就是I/O 流类库。软件包有时称为库文件 (.lib文件),类库是指用面向对 象方法实现的软件包。 第12章 I/O流及输入输出 12.1 流类库概述 12.2 输出流 12.3 输入流 12.4 输入/输出流 12.5 重载插入和提取运算符 12.1 流类库概述 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -5- 第12章 流类库概述 C++语言没有输入/输出语句,但C++编译 系统带有一个面向对象的输入/输出软件 包,它就是I/O流类库。 在C++中,将数据从一个对象到另一个对 象的流动抽象为 “流 ”,这里的对象指程 序或者 “文件 ”。注意,输入输出是相对 与程序而言的。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -6- 第12章 流类库概述 在C++中,用面向对象的方法来实现流。为了 实现流,定义了几种流类: ios是抽象流基类 ios的派生类istream是输入流基类 ios的派生类ostream是输出流基类 iostream是输入/输出流类,它由istream和 ostream两个基类共同派生出来 输入流基类、输出流基类和输入/输出流类又 各自派生出三个子类 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -7- 第12章 流类库概述 从程序的角度来看,可能需要从输入流 中获取数据,称为提取操作,可能需要 向输出流中添加数据,称为插入操作。 在I/O流类中定义了若干成员函数,其中 有两个特殊的成员: 提取运算符:>> 插入运算符:<< 12.2 输出流 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -9- 1、设备输出流 系统已经定义了标准设备输出流类,并且已经定 义了该类的对象: ? cout 标准输出,缓冲区满时被输出。 ? cerr 标 准 错 误 输 出 , 没 有 缓 冲 , 发 送 给 它 的 内 容 立即被输出。 ? clog 类 似 于 cerr, 但 是 有 缓 冲 , 缓 冲 区 满 时 被 输 出。 程 序 中 只 需 #include <iostream.h>,可以直接 使用这些对象,从键盘输入,向显示器输出。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -10- 1、设备输出流 标准输出设备一般指显示器,但可以在 操作系统下修改为别的设备,比如,重 定向为磁盘文件。 流cerr和clog把信息输出到默认错误日 志上,该日志通常是指显示器,不能重 定向。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -11- 1、设备输出流 可以使用操纵符或调用成员函数进行输 出格式控制。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -12- 2、文件输出流 ostream类的派生类ofstream类支持向磁 盘文件输出。 如果程序需要把数据信息输出到磁盘文 件,可以构造一个ofstream类的对象。 可以在定义流对象的同时,指定相关联 的文件;也可以先定义流对象,随后调 用open成员函数,指定相关联的文件并 打开。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -13- 2、文件输出流 在输出到文件时,同样可以使用操纵 符,或使用与操纵符等价的成员函数进 行格式控制。 12.3 输入流 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -15- 1、标准设备输入流 系统已经预先定义了标准设备输入流, 并且已经定义了该类的对象cin。一般不 需要构造新的设备输入流对象,只使用 预先定义的cin对象。 从输入流提取时,也可以使用的操纵符 进行输入格式的控制。 从输入流提取时,也可以使用流类定义 的函数进行输入操作。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -16- 2、文件输入流 文件输入流类ifstream,支持从磁盘文件读 取。如果需要一个仅用于读取的磁盘文件,可 以构造一个ifstream类的对象,并且可以指定 使用二进制或文本模式。 可以在定义流对象的同时,指定相关联的文 件,在构造该对象时自动打开文件;也可以先 定义流对象,随后调用open成员函数,指定相 关联的文件并打开。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -17- 2、文件输入流 很多格式化选项和成员函数都可以应用 于ifstream类对象 12.4 输入/输出流 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -19- 12.4 输入/输出流 输入输出流类iostream,该类对象可以 是数据的源或目的。 iostream类有一个重要的派生类: fstream,它支持磁盘文件的输入和输 出,如果程序需要对同一个磁盘文件既 要读又要写,可以构造一个fstream对 象。 12.5 重载插入和提取运算符 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -21- 12.5 重载插入和提取运算符 预定义的插入和提取运算符可以处理基 本数据类型的输入输出问题,而用户自 定义的类如果希望使用插入运算符执行 输出,把类的信息插入到一个输出流 ostream中,就需要在类中重载插入运 算符,提取运算符也一样。 重 载插入和提取运算符的特性使得I /O 流可扩展。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -22- 12.5 重载插入和提取运算符 重载的运算符形式如下: istream & operator >> (istream & ins, MyClass & obj); ostream & operator << (ostream & outs, MyClass & obj); 注意:不能将重载的插入和提取运算符 定义为类的成员函数,只能定义为一般 的函数或者类的友元函数。 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -23- 作业 2005-4-27 北京邮电大学电信工程学院计算机技术中心 -24-