C课件C输入输出流与文件系统.ppt_第1页
C课件C输入输出流与文件系统.ppt_第2页
C课件C输入输出流与文件系统.ppt_第3页
C课件C输入输出流与文件系统.ppt_第4页
C课件C输入输出流与文件系统.ppt_第5页
免费预览已结束,剩余41页可下载查看

下载本文档

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

文档简介

第10章C 输入 输出流与文件系统 第10章C 输入 输出流与文件系统 学习目标 理解C 的输入 输出流的概念 熟悉I O流的工作过程 熟悉各种格式标志与各种格式控制方法 分清文本文件与二进制文件的区别 掌握文本文件的输入 输出的步骤与操作 掌握二进制文件的输入 输出的步骤与操作 会运用文件指针以及各种标志 C 中的I O流实际上是一个处于传输状态的字节序列 这些字节序列按顺序从一个对象传送到另一个对象 在对象之间的 流动 流形象表示了信息从源到目的端的传送过程 在C 程序中 流的操作包括数据的输入与输出 输入操作是字节从外输入操作是字节序列从外部设备 包括键盘 磁盘 网络连接 输入到内存 是字节从设备到内存的流动 输出操作是从内存输出到外部设备 如显示器 打印机 磁盘 网络连接 是字节从内存到外部设备的流动 10 1输入 输出流的概念 在C 中 数据的输入 输出是通过I O流类库实现的 C 的I O流类库采用功能强大的类层次结构实现 它能够提供数百种与数据输入和输出相关的功能 I O流类库中各个类模板之间的层次关系如图11 1所示 I O流类模板是流类库的基础 描述如下 ios类是类模板basic ios的窄字符的实例 是所有I O流类的基础类 描述了流的基本性质 派生类istream与ostream从公共基类继承了一些成员 在这些继承来的数据成员中 大部分用于描述流的属性或特征 如流的格式与状态 除了继承来的成员外 istream与ostream各自添加了合适的本地成员 并重载了适当的运算符 例如istream增加了在流中读取数据和移动数据的方法 对提取运算符 进行了重载 iostream对istream和ostream进行了多重派生 因而它既继承了读取流操作 又继承了写入流操作 但iostream没有增加额外的数据成员 而且除了构造函数与析构函数外 没有新增其他成员函数 ifstream与ofstream分别用于文件的输入与输出 派生于iostream的fstream用于控制文件流的输入输出 10 1输入 输出流的概念 要从I O流中获取数据或向流中添加数据 必须使用流插入运算符 本来在C 中被定义为左移位运算符和右移位运算符的 但为了I O的需要 C 又将它们进行了重载 以便能用它们输入或输出各种类型的数据 输出流是就是流向输出设备的数据信息 输出流对象是数据信息流向的目标 在C 中 最重要的三个输出流是ostream fostream和ostrstream ostream类可以提供无格式化输出和格式化输出 例如 用插入运算符 输出标准类型数据 用put成员函数输出字符 用write成员函数实现无格式输出 最常用的输出方法是在cout上用插入运算符 插入运算符可以接受任何标准类型的实参 包括constchar 标准库string complex等类型 实参可以是任何表达式包括函数调用 只要其结果是能被插入运算符能接受的数据类型即可 10 2输出流 2 链表类模板 运行结果 acstringac string 3 14159 1 234 121110 i 0012FF4Cpi 0012FF4C s1 0012FF70s1 00473040 2 链表类模板 运行结果 thelargerof10 20is0 格式标志是一组用于设置I O流格式状态字的一个数 这些格式标志属于ios类 10 3 1格式控制标志 表10 2I O流格式标志功能表 表中带 号的表示默认设置 为或运算 每一个输入 输出流对象都维护一个格式状态字 用它表示流对象当前的格式状态并控制流的格式 例如整型值的进制基数或浮点数的精度 C 提供了多种格式控制的方法 如使用操纵符修改对象的格式状态字来控制流的格式 运用成员函数 10 3 1格式控制标志 表10 3格式状态字设置函数 其中 IFlags与IMask可以是单个格式标志 也可以是与运算 和或运算 将格式标志连接的表达式 还可以是一个长整型数 2 链表类模板 2 链表类模板 运行结果 Defaultflagis 201800hex200dec400octe00basefield100internal40left80right1c0adjustfield2000fixed1000scientifice00basefield8showbase10showpoint20showpos1skipws4uppercase4000boolalpha2unitbuf C 还提供了许多流操纵符 用于执行格式化的输入 输出操作 这些操纵符可以直接用在流中 10 3 2格式操纵符 表10 4格式操纵符 2 链表类模板 运行结果 Defaultflagis 201AftersetHex 800boolvalue 1boolalpha truex 64 10 3 3格式控制成员函数 表10 5格式控制成员函数 从成员函数表中可以看出 成员函数的功能与操纵符中的函数对应 如 width 与setw fill c 与setfill c precision n 与setprecision n flags flag 与setiosflags flag 分别对应 2 链表类模板 2 链表类模板 运行结果 3 141593000000033 13 143 1423 14163 141593 1415933 14159273 141592653 1415926543 141592654000000033 13 143 1423 14163 141593 1415933 14159273 141592653 1415926543 141592654 istream类提供了格式化和非格式的输入功能 最常用的输入方法是在标准输入流对象cin上使用用提取操作符 格式如下 cin obj1 obj2 提取操作符从与键盘相连的标准输入流cin中提取数据拷贝给相应的对象 数据的提取与拷贝是从输入回车开始的 提取操作符忽略了流中的空白 制表符 回车 换行 当遇到流结束标志EOF 1 或者提取了一个无效的值试图拷贝给对象时 提取操作符 返回0 false 给cin 每个输入流都含有一系列错误状态位 当提取了一个无效值给对象时 比如 输入类型错时 除了返回出错信息false给cin外 还会设置流的failbit状态位 结束提取操作 10 4输入流 2 链表类模板 运行结果 2a 3 45 67 8 9ab 2a3 45 67 89a 表10 6输入流常用成员函数 2 链表类模板 运行结果 1234567890 1234456784902 2 链表类模板 运行结果 1234567890 或12345 0 12344 对编程者而言 用户的行为是无法预测的 如当程序期望用户输入整数 而用户有意或无意输入了字符串 或超过了整数表示范围的数 这都会使数据流产生错误 在ios类中 除了提供控制数据流的格式标志 操纵符 成员函数 还提供了流的错误侦测函数与错误状态位 这些流错误状态位 标志 属于ios类 各种标志及意义如表10 7 10 5数据流的错误侦测 表10 7流错误状态标志 流的这些错误可以使用ios类提供的错误侦测函数来读取 流错误侦测函数如表10 8 表10 8流错误侦测函数 流的这些错误可以使用ios类提供的错误侦测函数来读取 流错误侦测函数如表10 8 10 5数据流的错误侦测 2 链表类模板 2 链表类模板 运行结果 cin rdstate 0a Inputiserror cin rdstate 0b Inputiserror cin rdstate 08 Inputiscorrect 到目前为止 程序执行所需的数据由键盘输入 执行的结果在显示器上显示或临时存于内存中 一旦程序执行完毕 数据将从内存中消失 下一次执行数据必须重新输入 将程序所需数据和产生的数据保存的方法是使用文件 文件是保存在辅存中 如磁盘 光盘 磁带中的数据集合 C 语言把每个文件看成是一个有序的字节流 文件打开时 就创建一个对象 并将这个对象和某个流关联起来 包含时 会自动生成cin cout cerr和clog这4个对象 与这些对象关联的流提供与文件通信的方法 文件操作 如cin对象使程序从键盘或文件中输入数据 cout对象使程序能向屏幕或文件输出数据 cerr和clog使程序能向屏幕或其他设备输出错误信息 10 6文件的输出 输入 10 6文件的输出 输入 C 负责文件输出 输入的类有ifstream 文件输入 ofstream 文件输出 以及fstream 文件输出 输入 见图10 1 所谓的文件输入输出 是从程序或内存的角度而言的 文件输入是指从文件向内存读入数据 文件输出则指从内存向文件输出数据 类ifstream ofstream fstream分别在包含头文件ifstream ofstream fstream中定义 要使用它们 必须包含相应的头文件 可以使用这些类建立文件流对象 如下列语句 fstreammyfile 建立了一个文件流对象myfile 然后利用fstream提供的open 成员函数打开文件与流连接 open 函数的原型如下 表10 9文件打开 操作 模式表 10 6 1文件的创建 例如 myfile open d myprog p1 1 cpp ios in ios out 打开文本文件p1 1 cpp用于输入输出 当用fstream ofstream ifstream建立文件流对象时可直接给出文件名 操作模式等参数 这样可以省略open 函数的使用 输出文件流的建立可以使用如下方法 fstreamofile c myprog f1 cpp ios out ofstreamofile c myprog f1 cpp 输入文件流的建立方法 fstreamifile c myprog f1 dat ios in ifstreamifile c myprog dat cpp 从图11 1I O流类层次结构中可以看出 fstream类继承于iostream 而iostream又继承于istream和ostream 因此 定义于istream与ostream处理数据流输出与输入的成员函数都可以用在文件的输出与输入上 10 6 2文本文件的输出 C 的文件I O模式分为两种 文本模式与二进制模式 默认的文件模式为文本模式 当使用文本模式时 输出到文件的内容为ASCII码字符 包括回车 换行 也就是说 文本文件中只能存储ASCII码字符 如整数123与浮点数234 5在文本文件中分别存储为 123 与 234 5 文本文件通常以 txt为后缀 C 的源程序文件也属于文本文件 文本文件在windows的记事本与书写器中都能打开 在linux系统下可以用vi emacs等文本编辑软件来编辑 文本文件输出可用插入操作符 与成员函数write 文件输出的步骤一般为 1 建立输出文件流 对象 将建立的文件连接到文件流上 此步需要对文件是否建立成功进行判断 如果文件建立错误 则退出 2 向输出文件流输出内容 3 关闭文件 文件流对象消失时也会自动关闭文件 2 链表类模板 运行结果 输入 Antony80 5 John90 Tom60 Z 文件record txt中的内容为 Antony80 5John90Tom60 10 6 3二进制文件的输出 文本文件中存储的是字符串 当我们要使用其中的数据就不方便了 如求学生成绩文件中的学生成绩的平均分 二进制文件是指含ASCII码字符外的数据的文件 它不能由文本编辑软件打开 在实际应用中 大多数文件都是二进制文件 如图象文件 后缀包括 bmp jpg tif gif 等 影像文件 声音文件 数据库文件 MicrosoftWord的 doc文件也是二进制文件 因为除了字符外 它还含有字体 字号 颜色等数据 输出二进制文件的方法是使用write 成员函数 2 链表类模板 2 链表类模板 2 链表类模板 程序解释 文件结果对照表如下表 表10 10文本文件与二进制文件对比 从表中看出 数据85 5在文本文件中为字符串 85 5 长度为4字节 在二进制文件中为0000AB42 占固定长度4字节 即浮点数的长度 10 6 4文本文件的输入 文件的输入是指从文件中读数据到内存中 文本文件输入常用提取操作符 在文件输入中要经常检查文件是否到达尾部 输入流的成员函数eof 用来侦测是否到达文件结尾 若读取到文件结尾时 返回true 文件输出一般要经过下列三个步骤 1 建立输入文件流 对象 将以输入方式打开的文件连接到文件流上 此步需要对文件是否打开成功进行判断 如果文件打开错误 则退出 2 从输入文件流中读内容 此步需要对读文件是否成功进行判断 如果读入不成功或到文件尾 则读入结束 3 关闭文件 文件流对象消失时也会自动关闭文件 2 链表类模板 10 6 5二进制文件输入 输入二进制文件使用成员函数read 每次读取固定长度的数据 同样用eof 判断是否到达文件尾 2 链表类模板 运行结果 Antony80 5John90Tom60Tom60 在文件中 特别是二进制文件 每一笔数据 记录 都是一个接着一个连续排列 文件中记录的排列与内存中的数组一样 前面例子对文件的读写都是从头到尾 是否可以象读取数组一样随机读取文件中某个记录 有了文件指针后 就可以直接跳到指针处 读写指针处的记录 在ios类中 定义了三个特定的文件指针 ios beg 文件开头指针ios cur 当前指针位置ios end 文件尾指针 10 6 6文件指针的使用 表10 11指针成员函数表 在istream与ostream类里定义了一些用来移动指针的成员函数 我们称为指针成员函数 列表如表10 11 10 6 6文件指针的使用 2 链表类模板 2 链表类模板 2 链表类模板 运行结果 程序运行前 文件record da

温馨提示

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

评论

0/150

提交评论