ch10输入、输出流.ppt_第1页
ch10输入、输出流.ppt_第2页
ch10输入、输出流.ppt_第3页
ch10输入、输出流.ppt_第4页
ch10输入、输出流.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十章输入 输出流P369 本章主要内容10 1C 流库概述10 2预定义类型的输入 输出10 3格式控制10 4自定义类型的输入 输出10 5文件的输入 输出 10 1C 语言的输入 输出 一 外部设备与文件计算机程序要与外界进行交互就必须使用相应有机制与输入 输出设备交换数据 程序的输入是指从输入设备接收数据 程序的输出是指将数据传递给外部设备 数据通常组织为文件形式 在操作系统中 输入 输出设备被视为一种特殊的文件 如 在DOS中 显示器被命名为CON文件 打印机被命名为PRN文件 二 程序中对文件的操作程序与外设的交互作用通过操作系统中的文件系统来实现 文件系统中提供了一系列系统调用接口 程序利用这些接口与外界进行交互 但系统调用接口的层次太低 在程序设计中使用起来太复杂 于是在高级语言中提出了抽象层次更高的输入 输出机制 C 语言提供了流类库完成输入 输出操作 接收输出数据的地方称为目标 发出输入数据的地方称为源 输入 输出操作可以看作是字符序列在源 目标与对象之间的流动 因而将完成输入 输出操作的类称为流类 源流目标流输入缓冲区 读 输出缓冲区 写 流的提取运算符 流的插入运算符 三 文件的基本概念C 语言将文件看作是一个字符的序列 即由一个个字节的数据顺序组成 这种文件也称为流式文件 1 文本文件与二进制文件根据文件中数据的组织形式 可将文件分为文本文件和二进制文件两类 文本文件中每一个字节存放一个ASCII码 表示一个字符 而二进制文件可以是任何类型的文件 通常源程序代码是文本文件 目标代码和可执行文件是二进制文件 2 只读文件 只写文件与可读可写文件从访问文件数据的存取控制方式来看 文件的访问方式可分为只读的 只写的或可读可写的 3 顺序文件与随机文件顺序文件是一个数据序列 对它的操作必须按顺序进行 如打印机 磁带机等设备对应的文件就是顺序文件 而随机文件的数据项可以通过地址直接访问 不必依照任何顺序 如磁盘等设备对应的文件就是随机文件 4 文件缓冲缓冲机制 内存缓冲区 用于解决外设速度远低于计算机处理数据速度的问题 10 2C 的流类库 一 流类库的基本结构所谓 流 就是数据从源 数据的生产者 到漏 数据的消费者 的流动 可以把一个流简化地理解为 提供字符的源 称为输入流 或收集字符的漏 称为输出流 C 流库是C 语言为完成输入 输出工作而预定义的类的集合 这些类构成一个层次结构的系统 如图10 2 1 P371 所示 图10 2 1 流类库的基本结构 所有使用流类库的程序必须用 include指令声明 二 预定义的流 流类库通过重载C 语言的运算符 和 重载为输入运算符 也称为提取符 ostream流类相对于系统预定义类型把运算符 m n 10022输入时数据间加以空格cout 称为标准输出流 缺省时为显示器 如 intx 9 cout x x endl x 9cerr和clog 都是ostream withassign类的对象 称为标准错误输出流 固定关联到显示器 三 支持文件的流类 为支持在程序中对文件操作 C 的流类库从图10 2 1中的类派生了五个类 其类层次如图10 2 2所示 P373 所有使用流类库的程序必须用 include指令声明 程序中常用的三个类分别是 ifstream类 输入文件流 从istream类继承了读操作 仅用于读文件 ofstream类 输出文件流 从ostream类继承了写操作 仅用于写文件 fstream类 输入 输出文件流 从iostream类继承了读 写操作 可用于读 写文件 图10 2 2支持文件的流类层次 四 支持字符串的流类 C 的流类库支持使用字符串流 从图10 2 1中的类派生了字符串类 其类层次如图10 2 3所示 P373 所有使用字符串流类库的程序必须用 include指令声明 程序中常用的三个类分别是 istrstream类 ostrstream类和strstrea 10 3格式化输入 输出 流类库提供两种方法控制数据的格式 使用ios类的成员函数和使用输入 输出操纵符一 使用ios类的成员函数在ios类中声明了数据成员longx flags 它存储控制输入 输出的状态标志 每个状态标志占一位 状态标志的值只能是ios类中定义的那些枚举量 见课本P374 用成员函数操作状态标志 设置状态标志 ios中定义了用于设置状态标志的成员函数setf 它的原型 longios setf longflags 使用格式为 stream obj setf ios 状态标志 其中stream obj是被影响的流 用的最多的是cin和cout这两个对象 要设置多个标志要用 符分隔 清除状态标志 Ios的清除状态标志的成员函数是unsetf 取状态标志 Ios的取状态标志的成员函数是flags 设置域宽 填充字符和精度的成员函数 设置域宽 intios width 返回当前的域宽值 intios width intwid 此函数用于设置域宽 并返回原来的域宽值 注意 所设置的域宽仅对下一个流输出操作有效 当一次输出操作完成之后 域宽又恢复为默认字宽 设置填充字符 charios fill 和charios fill charc 默认填充字符为空 设置显示精度 intios precision 默认输出精度为6intios precision intnum 若实际精度 设置精度 则四舍五入后输出 举例 程序10 3 1演示利用ios类成员函数进行格式化输出的用法 include iostream h voidshowflags longf longi cout 0 x0001 i i 1 使i中为 1 的位不断右移if i voidmain longf f cout flags 取当前状态标志 showflags f 显示当前状态标志cout 123 n cout 123 456 n cout setf ios showpos ios scientific 追加标态字 f cout flags showflags f cout 123 n cout 123 456 n cout unsetf ios scientific 去掉scientifin标志 f cout flags showflags f cout 123 456 n cout width 15 cout 123 456 n cout fill cout width 15 cout precision 2 cout setf ios fixed cout 123 456789 n 文件名 li10 3 1 cpp 二 便用输入 输出操纵符控制格式 C 提供了下列标准的操纵符 所有不带参数的操纵符都定义在头文件iostream h中 而带参数的操纵符都定义在头文件iomanip h中 dec 设置十进制转换基格式标志 用于输入 输出 hex 设置十六进制转换基格式标志 用于输入 输出 oct 设置八进制转换基格式标志 用于输入 输出 ws 提取空白字符 仅用于输入 endl 插入换行符并刷新流 仅用于输出 ends 在串后插入终止空字符 仅用于输出 flush 刷新输出流 仅用于输出 setbase intn 设置转换基格式为n 取值0 8 10 或16 缺省时为0表示采用十进制 仅用于输出 resetiosflags longf 清除由参数f指定的格式位用于输入输出 setiosflags longf 用参数f设置格式位 用于输入 输出 setfill intc 设置填充字符 用于输入 输出 setprecision intn 设置浮点数精度为n 用于输入 输出 setw intn 设置域宽为n 用于输入 输出 例子 10 3 2 include iostream h 用于定义控制符 include iomanip h 用于定义控制符函数voidmain cout 123 setw 5 456 88 n cout 123 setw 5 setfill 456 setw 5 88 n 文件名 li10 3 2 cpp 输出结果为 12345688 123 4568 88 在第一个输出语句中 setw 5 把下一次输出整数456的域宽设置为5 但输出后域宽马上恢复为0 故输出的整数88与前面输出的456连在一起了 在第二个输出语句中为后两个整数都设置了域宽5 并把填充字符设置为 故得到了预想的格式 可见设置域宽的控制函数与成员函数ios width完全相同 仅对最靠近它的下一个流输出操作有影响 说明 在C 中 使用字符串作为输入流时必须创建类istrstream对象 然后像cin一样使用这些对象 例10 3 3 将字符串的内容作为输入流 li10 3 3 cpp使用字符串作为输出流时必须创建类ostrstream对象 然后用该对象代替输出流对象cout 数据格式化的输出结果存放在一个字符串中 该字符串的存储空间由ostrstream申请和释放 程序员可以用str 成员函数来访问 例10 3 4 将数据格式化输出到字符串中 li10 3 4 cpp 三 格式化输出到字符串 10 4常用成员函数输入 输出 istream类和ostream类除了提供格式化的输入输出之外 还提供了其他一些输入输出功能 输出功能的常用成员函数包括 put write 等 输入功能的常用成员函数包括 read gcount get getline peek putback ignore 等 其中 write read gcount函数可实现无格式的输入输出 一 put成员函数 格式 cout put 字符或字符变量 功能 把一个字符输出到流中 如 cout put A 显示单个字符cout put A put 0 级联调用 先输出字符A后输出换行符等效于cout put A put 0 cout put 65 显示字符A 二 write成员函数 格式 cout write 字符串或字符数组名 个数n 功能 向流中输出多个字符 第一个参数指向待输出的字符串 如 charbuffer hellohappy cout write buffer 5 输出buffer中前5个字符cout write hellohappy 5 输出字符串中前5个字符voidmain chars thisisastring cout write s 4 运行结果为 this 三 read和gcount成员函数 read函数 将指定数量的字符输入到内存中的字符数组 如 chars 20 cin read s 20 输入20个字符到s中gcount函数 统计最后一次输入操作读取的字符数 如 cout write s cin gcount 输出s中所输入的字符cout s gcount函数可以统计使用getline get read等成员数读入的无格字符个数例10 4 1 write read和gcount成员函数的用法P383 四 get成员函数 格式1 cin get 从指定输入流中提取一个字符 包括空格 并返回该字符作为函数调用的值 遇到输入流中的文件结束符时 返回EOF 格式2 cin get ch 从输入流中读入一个字符 包括空格 赋给字符变量ch 格式3 cin get 字符数组 数组字符个数 终止字符 缺省为 n 从输入流中读取指定字符到数组 函数要么在读取到比指定的最大字符数少一个字符后停止 要么在读取到指定的分隔符终止 li10 4 2 cpp 五 getline成员函数 格式 cin getline 字符数组 字符串最大长度 分隔符 功能 与相应的get函数十分类似 从输入流中读取一行字符 说明 使用cin输入字符串时 空格之后的内容被丢失 而使用getline则可以按行接收字符串 例 li10 4 3 cpp 六 ignore成员函数 格式1 cin ignore 功能 删除输入流中的分隔符 如换行符 n 格式1 cin ignore n 终止字符 功能 跳过输入流中n个字符 或遇到指定终止符时提前结束 如 cin ignore 10 B 表示跳过输入流中10个字符 或遇到字符B就终止了 10 5设计自己的输入 输出操作 C 语言创建自己的流库的主要目的 就是使用户自定义类型数据的输入 输出也能像系统预定义类型的输入 输出一样简单 方便 这通过重载提取 输入 运算符 和插入 输出 运算符 来实现 一 重载流的插入操作 输出运算符 用友元函数重载输出运算符 来实现用户自定义类型对象的输出 定义运算符函数的格式如下 friendostream include iostream h classThreeD intx y z public ThreeD inti intj intk x i y j z k friendostream 举例 重载输出运算符 的应用 ostream 文件名 li10 5 1 cpp 输出结果为 11 22 33 45 56 67 二 重载流的提取操作 输入运算符 重载输入 输出运算符时必须使用友元函数 重载输入运算符的友元函数的定义格式如下 friendistream 举例 重载输入运算符 的应用 include classThreeD intx y z public ThreeD inti intj intk x i y j z k friendistream istream 文件名 li10 5 2 cpp 五 设计自己的输入 输出操纵符P394 操纵符是一类特殊的函数 可由用户自己定义 输出操纵符的定义格式为 ostream 10 7文件流P396 C 把文件当作是字符序列 按照数据的组织形式 可以把文件分成ASCII文件和二进制文件两种 ASCII文件也叫文本文件 其每个字节放一个ASCII代码 表示一个字符 所谓二进制文件 就是把内存中的数据按其在内存中的存储形式原样写到外存储器中 在C 中 为了进行文件的输入 输出 必须首先键立一个文件流 然后把这个流和实际的文件相关联 这称为打开文件 为处理文件的输入 输出 C 分别从istream类 ostream类和iostream类公有派生出了ifstream类 ofstream类和fstream类等三个面向文件的流类 在执行文件输入 输出之前 需要做三件事情 在程序中包含头文件fstream h 建立文件流 即说明面向文件流类的对象 打开文件 即是使某个文件和某一文件流相关联 声明了流对象之后 使用函数open 打开文件 文件的打开即是在流与文件之间建立一个连接 open函数的原型是 voidopen constchar filenqme intmode intprot filebuf openprot 参数的作用如下所述 一 文件的打开与关闭 第一个参数指定与此文件流相关联的文件的名字 第二个参数mode的值决定了文件的打开方式 第三个参数决定文件的保护方式 用户通常只使用缺省值 其中 第二个参数mode的取值必须是ios类中定义的枚举量 常用的枚举常量及含义如下 app 追加数据 写到文件尾 ate 把文件指针移到文件尾 in 以输入方式打开文件 out 以输出方式打开文件 binary 以二进制方式打开文件 trunc 若文件存在则清除原有内容 Nocreate 若文件不存在则失败 不可创建 Noreplace 若文件存在则失败 不可覆盖 在下述情况下可以使用缺省值 创建ifstream类对象时 缺省的mode值为ios in 而创建ofstream类对象时 缺省的mode值为ios out 若未显式指明以二进制方式打开文件 则缺省的方式为文本方式 若指定ios out但未指定ios ate或ios app 则隐含了ios trunc 可以把文件的几种打开方式用或操作结合起来 例如 打开一个既可读又可写的文件 则其打开方式为ios in ios out 为了完成文本文件的输入 输出 通常只需使用输入运算符 和输出运算符 例如 把一个整数 一个浮点数和一个字符串写到文本文件中 程序如下 include iostream h include fstream h voidmain 定义输出文件流并打开相应文件若失败则 out 为tureofstreamout e mycpp bcli10 7 1 li1 txt ios app 创建并打开文件if out 如果文件打开失败则显示错误提示信息 cerr cannotopenthefile r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论