




已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章流类库与输入 输出 清华大学郑莉 目录 11 1I O流的概念及流类库结构11 2输出流11 3输入流11 4输入 输出流11 5综合实例 对个人银行账户管理程序的改进11 6深度探索11 7小结 2 11 1I O流的概念及流类库结构 当程序与外界环境进行信息交换时 存在着两个对象 一个是程序中的对象 另一个是文件对象 流是一种抽象 它负责在数据的生产者和数据的消费者之间建立联系 并管理数据的流动 程序建立一个流对象 并指定这个流对象与某个文件对象建立连接 程序操作流对象 流对象通过文件系统对所连接的文件对象产生作用 读操作在流数据抽象中被称为 从流中 提取 写操作被称为 向流中 插入 3 流类库结构 4 11 1I O流的概念及流类库结构 11 2输出流 最重要的三个输出流是ostreamofstreamostringstream 5 11 2 1构造输出流对象 预先定义的输出流对象 cout标准输出cerr标准错误输出 没有缓冲 发送给它的内容立即被输出 clog类似于cerr 但是有缓冲 缓冲区满时被输出 6 11 2输出流 11 2 1构造输出流对象 续 ofstream类支持磁盘文件输出如果在构造函数中指定一个文件名 当构造这个文件时该文件是自动打开的ofstreammyFile filename 可以在调用默认构造函数之后使用open成员函数打开文件ofstreammyFile 声明一个静态文件输出流对象myFile open filename 打开文件 使流对象与文件建立联系在构造对象或用open打开文件时可以指定模式ofstreammyFile filename ios base out ios base binary 7 11 2输出流 11 2 2使用插入运算符和操纵符 manipulator 插入 运算符是所有标准C 数据类型预先设计的 用于传送字节到一个输出流对象 控制输出宽度为了调整输出 可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度 dec oct和hex操纵符设置输入和输出的默认进制 8 11 2输出流 例11 1使用width控制输出宽度 includeusingnamespacestd intmain doublevalues 1 23 35 36 653 7 4358 24 for inti 0 i 4 i cout width 10 cout values i endl return0 9 11 2输出流 11 2 2使用插入运算符和操纵符 manipulator 输出结果 1 2335 36653 74358 24 例11 2使用setw操纵符指定宽度 11 2 cpp include include includeusingnamespacestd intmain doublevalues 1 23 35 36 653 7 4358 24 stringnames Zoot Jimmy Al Stan for inti 0 i 4 i cout setw 6 names i setw 10 values i endl return0 10 11 2输出流 11 2 2使用插入运算符和操纵符 manipulator 输出结果 Zoot1 23Jimmy35 36Al653 7Stan4358 24 例11 3设置对齐方式 11 3 cpp include include includeusingnamespacestd intmain doublevalues 1 23 35 36 653 7 4358 24 stringnames Zoot Jimmy Al Stan for inti 0 i 4 i cout setiosflags ios base left setw 6 names i resetiosflags ios base left setw 10 values i endl return0 11 11 2输出流 11 2 2使用插入运算符和操纵符 manipulator 输出结果 Zoot1 23Jimmy35 36Al653 7Stan4358 24 例11 4控制输出精度 11 4 cpp include include includeusingnamespacestd intmain doublevalues 1 23 35 36 653 7 4358 24 stringnames Zoot Jimmy Al Stan for inti 0 i 4 i cout setiosflags ios base left setw 6 names i resetiosflags ios base left setw 10 setprecision 1 values i endl return0 12 11 2输出流 11 2 2使用插入运算符和操纵符 manipulator 输出结果 Zoot1Jimmy4e 001Al7e 002Stan4e 003 11 2 3文件输出流成员函数 输出流成员函数有三种类型 与操纵符等价的成员函数 执行非格式化写操作的成员函数 其它修改流状态且不同于操纵符或插入运算符的成员函数 13 11 2输出流 11 2 3文件输出流成员函数 续 open函数把流与一个特定的磁盘文件关联起来 需要指定打开模式 put函数把一个字符写到输出流中 write函数把内存中的一块内容写到一个文件输出流中seekp和tellp函数操作文件流的内部指针close函数关闭与一个文件输出流关联的磁盘文件错误处理函数在写到一个流时进行错误处理 14 11 2输出流 例11 5向文件输出 11 5 cpp includeusingnamespacestd structDate intmondy day year intmain Datedt 6 10 92 ofstreamfile date dat ios base binary file write reinterpret cast 15 11 2输出流 11 2 3文件输出流成员函数 11 2 4二进制输出文件 以通常方式构造一个流 然后使用setmode成员函数 在文件打开后改变模式 使用ofstream构造函数中的模式参量指定二进制输出模式 16 11 2输出流 11 2 5字符串输出流 ostringstream 用于构造字符串功能支持ofstream类的除open close外的所有操作str函数可以返回当前已构造的字符串典型应用将数值转换为字符串 17 11 2输出流 例11 6用ostringstream将数值转换为字符串 11 6 cpp include include includeusingnamespacestd templateinlinestringtoString constT 18 11 2输出流 11 2 5字符串输出流 ostringstream 输出结果 51 2 函数模板toString可以把各种支持 插入符的类型的对象转换为字符串 11 3输入流 重要的输入流类 istream类最适合用于顺序文本模式输入 cin是其实例 ifstream类支持磁盘文件输入 istringstream 19 11 3 1构造输入流对象 如果在构造函数中指定一个文件名 在构造该对象时该文件便自动打开 ifstreammyFile filename 在调用默认构造函数之后使用open函数来打开文件 ifstreammyFile 建立一个文件流对象myFile open filename 打开文件 filename 打开文件时可以指定模式ifstreammyFile filename ios base in ios base binary 20 11 3输入流 11 3 2使用提取运算符 提取运算符 对于所有标准C 数据类型都是预先设计好的 是从一个输入流对象获取字节最容易的方法 ios类中的很多操纵符都可以应用于输入流 但是只有少数几个对输入流对象具有实际影响 其中最重要的是进制操纵符dec oct和hex 21 11 3输入流 11 3 4输入流相关函数 open函数把该流与一个特定磁盘文件相关联 get函数的功能与提取运算符 很相像 主要的不同点是get函数在读入数据时包括空白字符 第6章介绍过 getline的功能是从输入流中读取多个字符 并且允许指定输入终止字符 读取完成后 从读取的内容中删除终止字符 第6章介绍过 read成员函数从一个文件读字节到一个指定的内存区域 由长度参数确定要读的字节数 如果给出长度参数 当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取 22 11 3输入流 11 3 4输入流相关函数 续 seekg函数用来设置文件输入流中读取数据位置的指针 tellg函数返回当前文件读指针的位置 close函数关闭与一个文件输入流关联的磁盘文件 23 11 3输入流 例11 7get函数应用举例 11 7 cpp includeusingnamespacestd intmain charch while ch cin get EOF cout put ch return0 24 11 3输入流 11 3 4输入流相关函数 例11 8为输入流指定一个终止字符 11 8 cpp include includeusingnamespacestd intmain stringline cout Typealineterminatedby t endl getline cin line t cout line endl return0 25 11 3输入流 11 3 4输入流相关函数 例11 9从一个payroll文件读一个二进制记录到一个结构中 11 9 cpp include include includeusingnamespacestd structSalaryInfo unsignedid doublesalary intmain SalaryInfoemployee1 600001 8000 ofstreamos payroll ios base out ios base binary os write reinterpret cast 26 11 3输入流 11 3 4输入流相关函数 例11 9 续 ifstreamis payroll ios base in ios base binary if is SalaryInfoemployee2 is read reinterpret cast 27 11 3输入流 11 3 4输入流相关函数 例11 10用seekg函数设置位置指针 11 10 cpp 头部分省略intmain intvalues 3 7 0 5 4 ofstreamos integers ios base out ios base binary os write reinterpret cast values sizeof values os close ifstreamis integers ios base in ios base binary if is is seekg 3 sizeof int intv is read reinterpret cast 28 11 3输入流 11 3 4输入流相关函数 例11 11读一个文件并显示出其中0元素的位置 11 11 cpp 头部分省略intmain ifstreamfile integers ios base in ios base binary if file while file streamposhere file tellg intv file read reinterpret cast 29 11 3输入流 11 3 4输入流相关函数 11 3 5字符串输入流 istringstream 用于从字符串读取数据在构造函数中设置要读取的字符串功能支持ifstream类的除open close外的所有操作典型应用将字符串转换为数值 30 11 3输入流 例11 12用ostringstream将字符串转换为数值 11 12 cpp 头部分省略templateinlineTfromString conststring 31 11 3输入流 11 3 5字符串输入流 istringstream 11 4输入 输出流 一个iostream对象可以是数据的源或目的 两个重要的I O流类都是从iostream派生的 它们是fstream和stringstream 这些类继承了前面描述的istream和ostream类的功能 32 大公司面试体验 1 33 大公司面试体验 2 34 大公司面试体验 3 35 3 大公司面试体验 4 36 4 大公司面试体验 5 37 5 大公司面试体验 5 38 大公司面试体验 6 39 6 大公司面试体验 7 40 7 大公司面试体验 8 41 8 大公司面试体验 9 42 9 大公司面试体验 10 43 关于链表 掌握最基本问题很重要 大公司面试体验 11 44 关于队列 掌握最基本问题很重要 大公司面试体验 12 45 关于排序 掌握最基本问题很重要 大公司面试体验 13 46 关于面试 不仅仅是c 1 2 大公司面试体验 14 47 更纠结的 大公司面试体验 14 48 大公司面试体验 15 49 从现在的每一天开始 为未来做好准备舒展你的心灵 丰富自己的体验 从每一个细节汲取灵感的精华 大公司面试体验 15 50 11 5综合实例 对个人银行账户管理程序的改进 本例中程序结束时将每个账户的当前状态和过往的账目列表 将用户输入的存款 取款 结算等各种命令保存下来 下次启动程序时将这些命令读出并执行 这样各个账户就能够恢复到上次退出程序时的状态了 本例对处理命令进行模块化 建立了一个Controller类 用于保存账户列表 当前日期和处理指定命令 在主函数中将该类实例化 在需要处理命令的地方调用该类的成员函数即可 对Date类重载 运算符 对账户信息重载 运算符 51 例11 13个人银行账户管理程序 程序分为6个文件 date h是日期类头文件date cpp是日期类实现文件accumulator h为按日将数值累加的Accumulator类的头文件account h是各个储蓄账户类定义头文件account cpp是各个储蓄账户类实现文件11 13 cpp是主函数文件 52 11 5综合实例 对个人银行账户管理程序的改进 date h ifndef DATE H define DATE H includeclassDate 日期类 Date类中不再有静态成员函数read 其它内容与例10 24完全相同 std istream 53 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 account h ifndef ACCOUNT H define ACCOUNT H include date h include accumulator h include include includeclassAccount 账户类 Account类中为以下函数增加了一个参数 其它成员与例10 24完全相同virtualvoidshow std ostream account h中其它类的定义与例10 24完全一样 endif ACCOUNT H 54 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 account cpp中 只有以下几个成员函数的实现有所改变 其它内容与例10 24完全相同voidAccountRecord show const coutgetId t amount t balance t desc endl Account Account constDate 55 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 11 13 cpp include account h include include include include include includeusingnamespacestd structdeleter templatevoidoperator T p deletep classController 控制器 用来储存账户列表和处理命令private Datedate 当前日期vectoraccounts 账户列表boolend 用户是否输入了退出命令public Controller constDate 56 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 Controller Controller for each accounts begin accounts end deleter boolController runCommand conststring 57 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 intmain Datedate 2008 11 1 起始日期Controllercontroller date stringcmdLine constchar FILE NAME commands txt ifstreamfileIn FILE NAME 以读模式打开文件if fileIn 如果正常打开 就执行文件中的每一条命令while getline fileIn cmdLine controller runCommand cmdLine fileIn close 关闭文件 ofstreamfileOut FILE NAME ios base app 以追加模式打开文件cout stringcmdLine getline cin cmdLine if controller runCommand cmdLine fileOut cmdLine endl 将命令写入文件 return0 58 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 第一次运行结果 输入和输出与例9 16给出的完全相同 第二次运行结果2008 11 1 S3755217created2008 11 1 02342342created2008 11 1 C5392394created2008 11 5 S375521750005000salary2008 11 15 C5392394 2000 2000buyacell2008 11 25 023423421000010000sellstock03232008 12 1 C5392394 16 2016interest2008 12 1 C539239420160repaythecredit2008 12 5 S3755217550010500salary2009 1 1 S375521717 7710517 8interest2009 1 1 0234234215 1610015 2interest2009 1 1 C5392394 50 50annualfee a addaccount d deposit w withdraw s show c changeday n nextmonth q query e exit 后面省略 第二次执行程序时 第一次输入的数据完全被恢复了 59 11 5综合实例 对个人银行账户管理程序的改进 例11 13 续 11 6 1宽字符 宽字符串与宽流 普通字符和字符串的缺陷一个汉字被拆成两个字符例 strings 这是一个中文字符串 s size 返回18s substr 3 2 得到的结果是 且 s find 且 返回3 60 11 6深度探索 宽字符与宽字符串 宽字符 wchar t类型一般占2个字节 可以直接存下一个汉字宽字符的文字以 L 开头 例 wchar tc L 人 宽字符串 wstring类型与string同源typedefbasic stringstring typedefbasic stringwstring 例wstrings L 这是一个中文字符串 s size 返回9 61 11 6深度探索 11 6 1宽字符 宽字符串与宽流 宽流 宽流 以宽字符为基本单位的流wistream wifstream wistringstream wostream wofstream wostringstream wios wcin wcout wcerr wclog宽字符和宽字符串需要通过宽流输入输出宽流与普通流一一对应 彼此同源typedefbasic ifstreamifstream typedefbasic ifstreamwifstream 62 11 6深度探索 11 6 1宽字符 宽字符串与宽流 为宽文件流配置编码方案 文件以字节为单位 编码方案决定了宽字符和字节的对应关系例 L ABCD 占4个字节 L 甲乙丙丁 占8个字节 这由编码方案体现配置方法 用 代码页 编号构造locale对象执行流的imbue成员函数示例localeloc 936 创建本地化配置方案对象wcout imbue loc 设置wcout对象的编码方案wcout L 这是一个中文字符串 endl 输出字符串 63 11 6深度探索 11 6 1宽字符 宽字符串与宽流 例11 14用文件宽输入流查找文件中的 人 字 11 14 cpp 部分头文件引用省略 includeusingnamespacestd intmain localeloc 936 创建本地化配置方案wcout imbue loc 为wcout设置编码方案wifstreamin article txt 创建文件宽输入流 打开文件article txtin imbue loc 为in设置编码方案wstringline 用来存储一行内容unsignednumber 0 记录行号while getline in line number 行号加1if line find first of L 人 wstring npos 查找 人 字wcout number L line endl 输出包含 人 字的行 return0 64 11 6深度探索 11 6 1宽字符 宽字符串与宽流 11 6 2对象的串行化 串行化 将对象写入文件 使得在适当的时候对象能从文件中读出并恢复直接用write将对象内容输出 用read将对象恢复的问题对象中存在指针时 指针所指对象内容不会被保存 对象的成员本身可能是存在指针的对象 对象不仅是数据的集合 还包括一系列行为 用read只能恢复数据 不能触发相应行为 65 11 6深度探索 串行化的基本方法 手工串行化的基本方法手工编写save和load函数按照相同的顺序保存 恢复数据成员碰到指针时 首先保存指针是否为空
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新型页岩气开采技术2025年对环境保护产业发展的产业转型升级与政策建议报告
- 河口路面透水砖施工方案
- 新金融衍生品在2025年的市场拓展与风险控制技术解析
- 成都工人考试题库及答案
- 家居城的营销方案设计
- 英文黑骏马测试题及答案
- 成本员考试题目及答案解析
- 露营基地方案策划活动
- 模拟电子基础试题及答案
- 车工安全考试题及答案
- 戏水溪流改造工程方案(3篇)
- 审计数据采集规定
- 检验科危急值课件
- 农村建房技术培训课件
- 红十字救护员培训理论试题及答案
- 2025年新能源电动摆渡车景区运营绿色出行解决方案报告
- 安全素养提升培训考试题及答案解析
- 动量守恒定律模型归纳(11大题型)(解析版)-2025学年新高二物理暑假专项提升(人教版)
- 2025股权转让合同签订股权认购协议书
- 某小区改造配电室(电力)工程监理大纲
- 慢性阻塞性肺疾病(COPD)护理业务学习
评论
0/150
提交评论