




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章I O流 14 1C 流的概念14 2格式化I O14 3检测流操作的错误14 4文件流14 5字符串流 C语言中没有提供专门的输入输出语句 同样 C 语言中也没有专门的输入 输出 I O 语句 C 中的I O操作是通过一组标准I O函数和I O流来实现的 C 的标准I O函数是从C语言继承而来的 同时对C语言的标准I O函数进行了扩充 C 的I O流不仅拥有标准I O函数的功能 而且比标准I O函数功能更强 更方便 更可靠 14 1C 流的概念 在C 语言中 数据的输入和输出 简写为I O 包括对标准输入设备键盘和标准输出设备显示器 对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这三个方面 对标准输入设备和标准输出设备的输入输出简称为标准I O 对在外存磁盘上文件的输入输出简称为文件I O 对内存中指定的字符串存储空间的输入输出简称为串I O C 中把数据之间的传输操作称作流 在C 中 流既可以表示数据从内存传送到某个载体或设备中 即输出流 也可以表示数据从某个载体或设备传送到内存缓冲区变量中 即输入流 在进行I O操作时 首先打开操作 使流和文件发生联系 建立联系后的文件才允许数据流入或流出 输入或输出结束后 使用关闭操作使文件与流断开联系 C 为实现数据的输入和输出定义了一个庞大的类库 它包括的类主要有ios istream ostream iostream ifstream ofstream fstream istrstream ostrstream strstream等 其中ios为根基类 它直接派生四个类 输入流类istream 输出流类ostream 文件流基类fstreambase和字符串流基类strstreambase 输入文件流类同时继承了输入流类和文件流基类 当然对于根基类是间接继承 输出文件流类ofstream同时继承了输出流类和文件流基类 输入字符串流类istrstream同时继承了输入流类和字符串流基类 输出字符串流类ostrstream同时继承了输出流类和字符串流基类 输入输出流类iostream同时继承了输入流类和输出流类 输入输出文件流类fstream同时继承了输入输出流类和文件流基类 输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类 C 系统中的I O类库 其所有类被包含在iostream h fstream h和strstrea h这三个系统头文件中 各头文件包含的类如下 iostream h包含有 ios iostream istream ostream iostream withassign istream withassign ostream withassign等 fstream h包含有 fstream ifstream ofstream和fstreambase 以及iostream h中的所有类 strstrea h包含有 strstream istrstream ostrstream和strstreambase 以及iostream h中的所有类 在一个程序或一个编译单元 即一个程序文件 中当需要进行标准I O操作时 则必须包含头文件iostream h 当需要进行文件I O操作时 则必须包含头文件fstream h 同样 当需要进行串I O操作时 则必须包含头文件strstrea h 在一个程序或编译单元中包含一个头文件的命令格式为 include 当然若头文件是用户建立的 则头文件名的两侧不是使用尖括号 而是使用双引号 当系统编译一个C 文件对 include命令进行处理时 是把该命令中指定的文件中的全部内容嵌入到该命令的位置 然后再编译整个C 文件生成相应的目标代码文件 C 不仅定义有现成的I O类库供用户使用 而且还为用户进行标准I O操作定义了四个类对象 它们分别是cin cout cerr和clog 其中cin为istream withassign流类的对象 代表标准输入设备键盘 也称为cin流或标准输入流 后三个为ostream withassign流类的对象 cout代表标准输出设备显示器 也称为cout流或标准输出流 cerr和clog含义相同 均代表错误信息输出设备显示器 因此当进行键盘输入时使用cin流 当进行显示器输出时使用cout流 当进行错误信息输出时使用cerr或clog C 的流通过重载运算符 执行输入和输出操作 输出操作是向流中插入一个字符序列 因此 在流操作中 将运算符 称为提取运算符 1 cout在ostream输出流类中定义有对左移操作符 重载的一组公用成员函数 函数的具体声明格式为 ostream operator 简单类型标识符 简单类型标识符除了与在istream流类中声明右移操作符重载函数给出的所有简单类型标识符相同以外 还增加一个void 类型 用于输出任何指针 但不能是字符指针 因为它将被作为字符串处理 即输出所指向存储空间中保存的一个字符串 的值 由于左移操作符重载用于向流中输出表达式的值 所以又称为插入操作符 如当输出流是cout时 则就把表达式的值插入到显示器上 即输出到显示器显示出来 2 cin在istream输入流类中定义有对右移操作符 重载的一组公用成员函数 函数的具体声明格式为 istream operator 简单类型标识符 简单类型标识符可以为char signedchar unsignedchar short unsignedshort int unsignedint long unsignedlong float double longdouble char signedchar unsignedchar 之中的任何一种 对于每一种类型都对应着一个右移操作符重载函数 由于右移操作符重载用于给变量输入数据的操作 所以又称为提取操作符 即从流中提取出数据赋给变量 3 cerrcerr类似标准错误文件 cerr与cout的差别在于 1 cerr是不能重定向的 2 cerr不能被缓冲 它的输出总是直接传达到标准输出设备上 错误信息是写到cerr的项 即使在各种其他输出语句中 如果使用下列语句 则错误信息 Error 总能保证在显示器上显示出来 cerr Error n 4 clogclog是不能重定向的 但是可以被缓冲 在某些系统中 由于缓冲 使用clog代替cerr可以改进显示速度 clog Error n 14 2格式化I O 14 2 1ios类中的枚举常量在根基类ios中定义有三个用户需要使用的枚举类型 由于它们是在公用成员部分定义的 所以其中的每个枚举类型常量在加上ios 前缀后都可以为本类成员函数和所有外部函数访问 在三个枚举类型中有一个无名枚举类型 其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的 该枚举类型定义如下 enum skipws left right internal dec oct hex showbase showpoint uppercase showpos scientific fixed unitbuf stdio 各枚举常量的含义如下 1 skipws利用它设置对应标志后 从流中输入数据时跳过当前位置及后面的所有连续的空白字符 从第一个非空白字符起读数 否则不跳过空白字符 空格 制表符 t 回车符 r 和换行符 n 统称为空白符 默认为设置 2 left right internalleft在指定的域宽内按左对齐输出 right按右对齐输出 而internal使数值的符号按左对齐 数值本身按右对齐输出 域宽内剩余的字符位置用填充符填充 默认为right设置 在任一时刻只有一种有效 3 dec oct hex设置dec对应标志后 使以后的数值按十进制输出 设置oct后按八进制输出 而设置hex后则按十六进制输出 默认为dec设置 4 showbase设置对应标志后使数值输出的前面加上 基指示符 八进制数的基指示符为数字0 十六进制数的基指示符为0 x 十进制数没有基指示符 默认为不设置 即在数值输出的前面不加基指示符 5 showpoint强制输出的浮点数中带有小数点和小数尾部的无效数字0 默认为不设置 6 uppercase使输出的十六进制数和浮点数中使用的字母为大写 默认为不设置 即输出的十六进制数和浮点数中使用的字母为小写 7 showpos使输出的正数前带有正号 默认为不设置 即输出的正数前不带任何符号 8 scientific fixed进行scientific设置后使浮点数按科学表示法输出 进行fixed设置后使浮点数按定点表示法输出 只能任设其一 缺省时由系统根据输出的数值选用合适的表示输出 9 unitbuf stdio这两个常量很少使用 所以不予介绍 在ios中定义的第二个枚举类型为 enumopen mode in out ate app trunc nocreate noreplace binany 其中的每个枚举常量规定一种文件打开的方式 在定义文件流对象和打开文件时使用 在ios中定义的第三个枚举类型为 enumseek dir beg cur end 其中的每个枚举常量用于对文件指针的定位操作上 14 2 2ios类中的成员函数ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作 每个成员函数的声明格式如下 intbad inteo intfail voidclear charfill charfill charc longflags longflags longf intgood intprecision intrdstate intprecision intn intwidth longsetf longf intwidth intw longunsetf longf 因为所有I O流类都是ios的派生类 所以它们的对象都可以调用ios类中的成员函数和使用ios类中的格式化常量进行输入输出格式控制 下面以标准输出流对象cout为例说明输出的格式化控制 例14 1 14 2 3格式控制操作符数据输入输出的格式控制还有更简便的形式 就是使用系统头文件iomanip h中提供的操纵符 使用这些操纵符不需要调用成员函数 只要把它们作为插入操作符 的输出对象即可 这些操纵符及功能如下 decocthexwsendlendsflushsetiosflags longf resetiosflags longf setfill intc setprecision intn setw intw 在上面的操纵符中 dec oce hex endl ends flush和ws除了在iomanip h中有定义外 在iostream h中也有定义 所以当程序或编译单元中只需要使用这些不带参数的操纵符时 可以只包含iostream h文件 而不需要包含iomanip h文件 下面以标准输出流对象cout为例 说明使用操作符进行的输出格式化控制 例14 4 14 3检测流操作的错误 在I O流的操作过程中可能出现各种错误 每一个流都有一个状态标志字 以指示是否发生了错误以及出现了哪种类型的错误 这种处理技术与格式控制标志字是相同的 ios类定义了以下枚举类型 enumio state goodbit 0 x00 不设置任何位 一切正常eofbit 0 x01 输入流已经结束 无字符可读入failbit 0 x02 上次读 写操作失败 但流仍可使用badbit 0 x04 试图作无效的读 写操作 流不再可用hardfail 0 x80 不可恢复的严重错误 对应于这个标志字各状态位 ios类还提供了以下成员函数来检测或设置流的状态 intrdstate 返回流的当前状态标志字inteof 返回非0值表示到达文件尾intfail 返回非0值表示操作失败intbad 返回非0值表示出现错误intgood 返回非0值表示流操作正常intclear intflag 0 将流的状态设置为flag为提高程序的可靠性 应在程序中检测I O流的操作是否正常 当检测到流操作出现错误时 可以通过异常处理来解决问题 14 4文件流 14 4 1文件的概念在磁盘上保存的信息是按文件的形式组织的 每个文件都对应一个文件名 并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下 一个文件名由文件主名和扩展名两部分组成 它们之间用圆点 即小数点 分开 扩展名可以省略 当省略时也要省略掉前面的圆点 文件主名是由用户命名的一个有效的C 标识符 为了同其他软件系统兼容 一般让文件主名为不超过8个有效字符的标识符 同时为了便于记忆和使用 最好使文件主名的含义与所存的文件内容相一致 文件扩展名也是由用户命名的 1至3个字符组成的 有效的C 标识符 通常用它来区分文件的类型 如在C 系统中 用扩展名h表示头文件 用扩展名cpp表示程序文件 用obj表示程序文件被编译后生成的目标文件 用exe表示连接整个程序中所有目标文件后生成的可执行文件 对于用户建立的用于保存数据的文件 通常用dat表示扩展名 若它是由字符构成的文本文件则也用txt作为扩展名 若它是由字节构成的 能够进行随机存取的内部格式文件则可用ran表示扩展名 在C 程序中使用的保存数据的文件按存储格式分为两种类型 一种为字符格式文件 简称字符文件 另一种为内部格式文件 简称字节文件 字符文件又称ASCII码文件或文本文件 字节文件又称二进制文件 在字符文件中 每个字节单元的内容为字符的ASCII码 被读出后能够直接送到显示器或打印机上显示或打印出对应的字符 供人们直接阅读 在字节文件中 文件内容是数据的内部表示 是从内存中直接复制过来的 当然对于字符信息 数据的内部表示就是ASCII码表示 所以在字符文件和在字节文件中保存的字符信息没有差别 但对于数值信息 数据的内部表示和ASCII码表示截然不同 所以在字符文件和在字节文件中保存的数值信息也截然不同 要在程序中使用文件时 首先要在开始包含 include命令 由它提供的输入文件流类ifstream 输出文件流类ofstream和输入输出文件流类fstream定义用户所需要的文件流对象 然后利用该对象调用相应类中的open成员函数 按照一定的打开方式打开一个文件 文件被打开后 就可以通过流对象访问它了 访问结束后再通过流对象关闭它 14 4 2文件的打开与关闭流可以分为3类 输入流 输出流以及输入 输出流 相应地必须将流说明为ifstream ofstream以及fstream类的对象 例如 ifstreamifile 说明一个输入流ofstreamofile 说明一个输出流fstreamiofile 说明一个输入 输出流说明了流对象之后 可使用函数open 打开文件 文件的打开即是在流与文件之间建立一个连接 open 的函数原型为 voidopen constchar filename intmode intprot filebuf openprot 其中 filename是文件名字 它可包含路径说明 mode说明文件打开的模式 它对文件的操作影响重大 mode的取值必须是以下值之一 ios in打开文件进行读操作ios out打开文件进行写操作ios ate打开时文件指针定位到文件尾ios app添加模式 所有增加都在文件尾部进行ios trunc如果文件已存在则清空原文件ios nocreate如果文件不存在则打开失败ios noreplace如果文件存在则打开失败ios binary二进制文件 非文本文件 对于ifstream流 mode的默认值为ios in 对于ofstream流 mode的默认值为ios out prot决定文件的访问方式 取值为 0普通文件1只读文件2隐含文件4系统文件一般情况下 该访问方式使用默认值 与其他状态标志一样 mode的符号常量可以用位或运算 组合在一起 如ios in ios binary表示以只读方式打开二进制文件 注意 打开文件操作并不能保证总是正确的 如文件不存在 磁盘损坏等原因可能造成打开文件失败 如果打开文件失败后 程序还继续执行文件的读 写操作 将会产生严重错误 在这种情况下 应使用异常处理以提高程序的可靠性 如果使用构造函数或open 打开文件失败 流状态标志字中的failbit badbit或hardbit将被置为1 并且在ios类中重载的运算符 将返回非0值 通常可以利用这一点检测文件打开操作是否成功 如果不成功则作特殊处理 每个文件流类中都提供有一个关闭文件的成员函数close 当打开的文件操作结束后 就需要关闭它 使文件流与对应的物理文件断开联系 并能够保证最后输出到文件缓冲区中的内容 无论是否已满 都将立即写入到对应的物理文件中 文件流对应的文件被关闭后 还可以利用该文件流调用open成员函数打开其他的文件 关闭任何一个流对象所对应的文件 就是用这个流对象调用close 成员函数即可 如要关闭fout流所对应的a xxk dat文件 则关闭语句为 fout close 14 4 3文件的读写1 文件读写方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年住院医师规培-黑龙江-黑龙江住院医师规培(放射科)历年参考题库典型考点含答案解析
- 2025年住院医师规培-陕西-陕西住院医师规培(口腔科)历年参考题库含答案解析
- 2025年住院医师规培-贵州-贵州住院医师规培(儿科)历年参考题库含答案解析
- 财务领域面试题目及答案解析
- 2025年住院医师规培-湖北-湖北住院医师规培(放射肿瘤科)历年参考题库典型考点含答案解析
- 2025年住院医师规培-海南-海南住院医师规培(口腔正畸科)历年参考题库含答案解析
- 2025年住院医师规培-浙江-浙江住院医师规培(超声医学科)历年参考题库含答案解析(5套)
- 2025年住院医师规培-江西-江西住院医师规培(外科)历年参考题库典型考点含答案解析
- 2025年住院医师规培-江苏-江苏住院医师规培(儿外科)历年参考题库典型考点含答案解析
- 2025年住院医师规培-新疆-新疆住院医师规培(核医学科)历年参考题库典型考点含答案解析
- 6G多维度切片QoS保障-洞察及研究
- 高考3500词汇表(完整版)
- 人教版新目标初中英语Go-for-it!单词大全(音标齐全-已反复校对-单词分类-便于识记)
- 人体解剖学与组织胚胎学(高职)全套教学课件
- 二年级上册语文教材解读-
- 学校文印室及时服务方案
- 毛振明《体育教学论》(第3版)配套题库【课后习题+专项题库】
- 集团公司内部资金调剂管理办法
- 思想道德与法治课件:专题五在实现中国梦的实践中放飞青春梦想
- 新人教A必修一《集合》课件
- 复用器械处理流程
评论
0/150
提交评论