输入输出流类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ifstream istream_withassign istrstream 输出流类 ostream ofstream ostream_withassign ostrstream 文件流类 串流 输入/输出流 输入 输出流 类 fstreambase strstreambase iostream fstream strstream
C++ I/O流类 流类 的结构( ) 的结构(1)
conbuf
streambuf
filebuf
strstreambuf
图11.1 流缓冲区类的派生关系
1. 流缓冲区类 在 C++I/O 类库定义文件 iostream.h 中有一个 streambuf
类,它用来提供物理设备的接口。缓冲区由一段预留 它用来提供物理设备的接口。 的字符存储空间和两个指针组成,两个指针分别指向 的字符存储空间和两个指针组成, 字符要被插入或被取出的位置。 streambuf 类定义了 字符要被插入或被取出的位置 。 一组缓冲或处理流的通用方法,诸如设置缓冲区,移 一组缓冲或处理流的通用方法,诸如设置缓冲区, 动指针,存、取字符等。 动指针, 取字符等。
第11章 输入输出流类 11章
外部设备可分为人机交互设备 和 外部设备可分为 人机交互设备和 人机交互设备 存储设备两个大类 两个大类。 存储设备两个大类。 人机交互设备主要指键盘、 显示 人机交互设备主要指键盘 、 器等终端控制台设备和打印机。 器等终端控制台设备和打印机。 存储设备指磁带、 磁 ( 软 、 硬 ) 存储设备指磁带 、 盘、光盘等以文件形式存储持久数据 的设备。 的设备。
long x_flags = 0x0080 = 0000 0000 1000 0000 输出显示基指示符 long x_flags = 0x0003 = 0000 0000 0000 0011 跳过输入空格 & 输出左对齐调整 long x_flags = 0x0083 = 0000 0000 1000 0011 跳过输入空格 & 输出左对齐调整 & 输出显示基指示符 long x_flags标志可以由 类的成员函数 flags(), setf() 标志可以由ios类的成员函数 标志可以由 访问, 和unsetf()访问,也可以用操纵函数操作。 访问 也可以用操纵函数操作。
早期程序设计语言中通常以文件 方式来统一人机交互设备和存储设备 的输入输出操作。 的输入输出操作 。 即将人机交互设备 当作一种特殊文件对待。 当作一种特殊文件对待。 以文件方式统一管理外部设备可 以屏蔽实际物理设备的差异, 以屏蔽实际物理设备的差异 , 有利于 整体上简化程序设计语言与外部设备 交换信息的处理过程。 交换信息的处理过程。
1.ios 类中定义的格式控制标志 .
ios 类中定义了一个数据成员:格式控制标志字 类中定义了一个数据成员:格式控制标志字long x_flags。 。 x_flags每一位的状态值用枚举符号常量定义。 每一位的状态值用枚举符号常量定义。 每一位的状态值用枚举符号常量定义
enum{ skipws =0x0001, left =0x0002, right =0x0004, internal =0x0008, dec =0x0010, oct =0x0020, hex =0x0040, showbase=0x0080, showpoint=0x0100, uppercase=0x0200, showpos =0x0400, scientific=0x0800, fixed =0x1000, unitbuf =0x2000, stdio =0x4000 }; //跳过输入空格 跳过输入空格 //输出左对齐调整 输出左对齐调整 //输出右对齐调整 输出右对齐调整 //输出符号和基指示符后的填补 输出符号和基指示符后的填补 //转换为十进制 //转换为十进制 (in/out) //转换为八进制 (in/out) 转换为八进制 //转换为十六进制 (in/out) 转换为十六进制 //输出显示基指示符 输出显示基指示符 //输出显示小数点 输出显示小数点 //大写十六进制输出 大写十六进制输出 //正整数显示前加上”+” 正整数显示前加上” 正整数显示前加上 //输出用科学表示法表示浮点数 输出用科学表示法表示浮点数 //输出用固定小数点表示浮点数 输出用固定小数点表示浮点数 //在输出操作后刷新所有流 在输出操作后刷新所有流 //在输出后刷新 在输出后刷新stdout和stderr 在输出后刷新 和
2. 输入输出流类 iostream.h中还有以ios类为基类的一组流
类的定义。 类的定义。 ios 类 及 其 派 生 类 均 含 有 一 个 指 向 streambuf 类的指针。 通过 streambuf 类代理物 类的指针 。 理设备的操作。 理设备的操作。 从类 ios开始,逐级派生,形成了较为复 开始 , 逐级派生 , 杂的结构,要很好地使用C++流类,必须逐级 杂的结构, 流类, 了解其父类的 public 、 和 protected 类型的成员 函数、成员变量。 函数、成员变量。
C++语言对输入输出的处理引入了 语言对输入输出的处理引入了 这个比文件抽象程度更高的概念。 “流”这个比文件抽象程度更高的概念。 输入输出操作被看作数据在源设备对象与 目标设备对象之间的流动。 目标设备对象之间的流动。 C++中完成输入输出操作的类称为流 中完成输入输出操作的类称为流 并提供了可重用的流类库。 类,并提供了可重用的流类库。
iostream_ wk.baidu.comithassign
图11.2 ios类的派生关系 类的派生关系
流 类 库 成 员 列 表
流类分类 流基础类 输入流类 ios istream
流类名称
流类作用 所有流类的父类、 所有流类的父类、保存流的状态并处理错误 输入流基础类、 输入流基础类 、 将流缓冲区中的字符作格式化 和非格式化之间的转换,并输入。 和非格式化之间的转换,并输入。 文件输入流类 输入流类即操作符>>输入流 为cin输入流类即操作符 输入流 输入流类即操作符 串输入流类 输出流的基础类、 输出流的基础类 、 将流缓冲区中的数据格式化 或非格式化转换,并输出。 或非格式化转换,并输出。 文件输出流类 cout,cerr,clog输出的流类即操作符 输出流 。 , 输出的流类即操作符<<输出流 , 输出的流类即操作符 输出流。 串输出流类 文件流基础类 串流基础类 多目的输入/输出流类的基础类 多目的输入 输出流类的基础类 文件流输入/输出类 文件流输入 输出类 串流输入/输出类 串流输入 输出类
11.2.2格式化的输入输出 格式化的输入输出
C++ 提供了两种格式控制函数用来控制输入
输出的格式: 输出的格式:
• ios类中定义的格式控制成员函数 类中定义的格式控制成员函数 类中定义的 • 基于流对象的操纵函数。 基于流对象的操纵函数
相比之下操纵函数使用更为方便。 下面重点 相比之下操纵函数使用更为方便 。 介绍操纵函数的概念和用法。 介绍操纵函数的概念和用法。
每一类都有文件和标准的输入和输出功能。 每一类都有文件和标准的输入和输出功能。这 里着重讨论使用流类的标准输入和输出, 里着重讨论使用流类的标准输入和输出,以及流类的 文件输入和输出。 文件输入和输出。
11.2.1标准输入输出 标准输入输出
标准输入与输出是指读键盘的数据和将数据 输 出 到 屏 幕 。 C++ 用 istream_withassign 类 和 ostream_withsaaign类来实现标准输入输出功能。 类来实现标准输入输出功能。 类来实现标准输入输出功能
上表中: 上表中: 基础类ios是所有流类的根 它有四个直接派生类: 是所有流类的根。 ( 1) 基础类 是所有流类的根 。 它有四个直接派生类 : istream、ostream、fstreambase和strstreambase,它们是流类 、 、 和 , 库中的基本流类。 库中的基本流类。 ( 2) istream和 ostream是 ios直接派生类 其功能是将数据格 和 是 直接派生类,其功能是将数据格 直接派生类 式化或非格式化数据与流缓冲区之间作转换处理。 式化或非格式化数据与流缓冲区之间作转换处理。 分别从istream (3) istream_withassign,ostream_withassign分别从 , 分别从 类派生, 和ostream类派生,并定义了 类派生 并定义了cin,cout流,作标准输入和输出处 流 理。 (4) 而iostream是istream和ostream类的多继承派生类, ) 是 和 类的多继承派生类, 类的多继承派生类 用来操作文件流的标准输入/输出 输出。 用来操作文件流的标准输入 输出。 的多继承派生类, (5) ifstream是istream和fstreambase的多继承派生类,用 ) 是 和 的多继承派生类 于处理文件的输入。 于处理文件的输入。 的多继承派生类, (6) ofstream是ostream和fstreambase的多继承派生类, ) 是 和 的多继承派生类 用于处理文件的输出。 用于处理文件的输出。
streambuf类有三个派生类,其中: 类有三个派生类,其中: 类有三个派生类 conbuf在constream.h中定义,提供 中定义, (1) ) 在 中定义 光标控制、清屏,定义活动窗口等控制台操作接 光标控制、清屏, 口和I/O缓冲区管理功能 缓冲区管理功能。 口和 缓冲区管理功能。 filebuf在fstream.h中定义,它用来维 中定义, (2) ) 在 中定义 护文件缓冲区的打开,关闭, 护文件缓冲区的打开,关闭,读、写,建立磁盘 文件的内存代理。 文件的内存代理。 中定义, (3) strstreambuf在strstream.h中定义, ) 在 中定义 提供在内存进行提取和插入操作的缓冲区管理。 提供在内存进行提取和插入操作的缓冲区管理。
11. 2 C++输入与输出 输入与输出
输入输出流可以从文件或设备中读出或写入数 运行库提供了两种输入输出功能。 据,C++运行库提供了两种输入输出功能。 运行库提供了两种输入输出功能
输出, (1)类输入 输出,把数据作为单字符流 )类输入/输出 处理。可以处理简单的数据, 处理。可以处理简单的数据,也可以处理复杂 的数据结构。 的数据结构。 (2)直接调用操作系统的底层功能实现 ) 输入/输出操作 输出操作。 输入 输出操作。
11. 1 C++流库结构 流库结构
标准ANSI C程序中的绝大部分工作 标准 程序中的绝大部分工作 是由ANSI C标准库中的 标准库中的printf,scanf完成 是由 标准库中的 , 完成 功能作为ANSI C标准库功能的一 的,I/O功能作为 功能作为 标准库功能的一 部分被提供。 部分被提供 。 在 C++中 iostream库提供了 中 库提供了 printf、 scanf功能的替代方法 , 输入输出 功能的替代方法, 、 功能的替代方法 功能的实现由一个iostream对象完成。 对象完成。 功能的实现由一个 对象完成
C++ I/O流类 流类 的结构( ) 的结构(2)
istream fstreambase
ios
strstreambase ostream
ifstream
istrstream
ofstream
ostrstream
iostream
fstream istream_withassign
strstream ostream_withassign
iostream.h 文 件 中 以 下 两 句 定 义 cin 和 cout两个标准流对象 两个标准流对象: 两个标准流对象 istream_withassign cin; ostream_withassign cout;
标准输入类istream_withassign和标准输 在 标准输入类 和标准输 出类ostream_withassign分别对操作符“>>” “<<” 分别对操作符 出类 分别对操作符“ 进行了重载, 进行了重载,用于完成对各种简单数据类型的输入 和输出。 和输出。