版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 十一 章 STL 输入输出流,第十一章 STL 输入输出流,STL IO 流类 标准 IO 流 标准输入流对象cin 标准输出流对象cout 文件 IO 流 打开读写关闭文件 文本文件与二进制文件 读写文本文件 读写二进制文件 随机读写文件 字符串 IO 流,256,流输入输出 流 数据流 数据传输像流水,从一端流向 另一端有方向 C/C+ 字节流 无论流中何种数据 文本、图形、图像、音视频,按字节传输读写 程序数据内存中 的输入、输出 程序的输入:输入设备 内存程序操作的数据 程序的输出:内存 输出设备 三种输入输出流 标准IO: 键盘 程序 显示器 文件IO: 文件 程序 文件磁盘文件
2、 字符串IO:内存 程序 内存,STL 输入输出流,366,STL Standard Template Library 简介 C+ 的组成部分编程时不需安装额外插件 众多技术人员经验的结晶,不用重复开发 直接使用!提高开发效率和代码质量时空效率 内容庞杂数据结构与算法,其中包含 IO 流类 位于 std 命名空间内:using namespace std;,STL 输入输出流, C, Windows API 还有自己的 IO 系统,466,STL 类库 提供了三种 IO 流类 标准 IO 流类 istream, ostream, iostream i: input, o: output, st
3、ream: 流 文件 IO 流类 ifstream, ofstream, fstream f: file 文件 字符串 IO 流类 istringstream, ostringstream, stringstream,STL 输入输出流,566,输入输出流类族结构部分,666,流对象与流操作符系统预定义 流对象:cin 绑定键盘 和 cout 绑定显示器 操作符:重载位运算符 和 ,用户可重载见操作符重载,标准 IO 流,输出?为什么?, 跳过空白字符,不跳过空白字符 该怎么写程序?,流对象有成员函数,766,get 与 getline int get(void); / 无参数 功能:从流中读
4、一个字符(含空白字符) 返回:该字符的 ASCII 码 (int) istream 功能:从流中读 n-1个字符(含空白),存入字符数组ch, 若遇 终止字符 c 提前结束。 区别:get 遇终止字符时,读位置停留在终止符前面, 下次从该位置继续读;getline 则跳过终止符。 返回:输入流对象*this 。流对象= 0 (假):不能用,流对象cin成员函数,n=1时,后面2个参数可略,866,流对象cin成员函数,把上面改为 cin.get(ch,20)实验 观察并理解实验结果,理解终止符,理解 流中的读写位置,string 怎么办,966,int peek(void) 功能:观察当前读位
5、置处的字符 并不真正读取,读位置不移动 返回:该字符的 ASCII 码int,流对象cin成员函数,读位置 每读一个字符后移一位,1066,istream #else typedef int streamsize; #endif,ignore( int n ) 等价:ignore(n, EOF) ignore( void ) 等价:ignore(1, EOF),1266,流对象cin成员函数,修改上例,get 不跳过终止符,不注释此句,实验,1366,流出错与状态位(bits) 如:输入 int 数据。输入有其他字符 如何发现和处理这类错误?置流对象状态位 相关成员函数 bool eof(vo
6、id) 返回 true:到达流的末尾end of file bool fail(void) 返回 true:遇到无效输入如读取数字时遇到其他字符, 流对象还可以继续用 void clear(void) 清除流所有状态位(goodbit, failbit, eofbit, badbit) int sync(void) 清空流缓冲区,流对象cin成员函数,未能读取有效数据,1466,流对象cin成员函数,逐个检查输入字符,缺点:检测不到,此时,流处于错误状态 且流缓冲区有错误字符,1566,cout 流对象 cout:console output. 控制台即显示器 有很多成员函数 操作符 输入、输
7、出自定义类型结构体、类等 时:重载它 操作符重载 cout 输出单个字符的成员函数 ostream cout.width(8); cout 100,100,100 n; system(pause); return 0; ,流对象cout格式化输出,2066,流类的成员函数续 setf( fmtflags fmtfl ) 设置指定标志,保留其余标志 unsetf( fmtflags fmtfl ) 清除指定标志 fmtfl precision(int n) 设置精度非格式标志,流对象cout格式化输出,用 setf 需先 unsetf,2166,格式操作符更简便,但不全:设置格式标志,流对象co
8、ut格式化输出,格式操作符需要用在输出(cout)表达式中 成员函数不要用cout,否则输出其返回值,2266,流对象cout格式化输出,设置进制和大小写,浮点数的默认显示方式,默认显示,2366,流对象cout格式化输出,设置显示域宽度和对齐,默认精度:6位有效数字,设置精度(有效数字),2466,计算机文件File 文件 讲磁盘文件 用途:数据存储于文件中外存,也有内存文件 名字:操作系统以文件为单位管理磁盘数据按名存取 C/C+ 按数据的存储格式分类 两类:文本文件、二进制文件 按用途分类 扩展名 *.MP3, *.RAR, *.DOC , *.GIF , *. AVI, 都是二进制文件
9、,需要专用软件才能读写它们 设备文件 键盘、鼠标、显卡、打印机、端口等外设都被抽象为 文件设备文件,读写该文件就是读写该设备,文件流文件概述,2566,文件的读写 程序员关心的 设备相关 不同的存储介质如U盘、光盘、磁盘、固态硬盘等 、不同的操作系统、不同的设备键盘、鼠标、显卡等,文件的管理方式和数据存储格式都有不同,十分繁杂 如显示程序:与显卡类型和显示模式等都相关难度很大 设备无关 我们只需用开发软件如VC、操作系统API、设备驱动程序等 提供的类或函数对文件进行读写:大大简化了 C 文件读写:函数自学 C+ 文件读写:流类 更强大、更安全、更简易 Windows API:Applicat
10、ion Programming Interface 函数自学,文件流文件的读写概述,2666,文件流类 #include ofstream:输出类,写文件:内存程序 文件 ifstream: 输入类,读文件:内存程序 文件 fstream: IO类,读写文件均可 文件流对象 根据需要选择流类后,创建其对象 流对象与具体某个文件绑定关联后,读写该流对象, 就是读写该文件 cin : 系统定义的流对象,绑定键盘设备文件 cout : 系统定义的流对象,绑定屏幕设备文件,文件流流类与流对象,2766,读写文件的三步曲 打开文件 选择文件流类 创建流对象 与文件绑定 读写文件 写 (Output):
11、内存变量 文件 读 (Input): 内存变量 文件 关闭文件 读写文件完毕后,及时关闭文件 文件是一种资源,同时打开数有限 下面按此顺序,讲解各个步骤的具体操作,文件流读写文件的步骤,2866,打开文件 创建流对象时:打开文件初始化 ifstream in( test.dat, ios:in); / in 与 test.dat 绑定 流对象已经创建:用 open 成员函数打开 ofstream out1, out2 ; out1.open( d:test.dat) ; out2.open( .test.dat ) ; 文件名(含路径) 文件名包含路径(绝对路径相对路径缺省路径) 可用字符串变
12、量很有用 保存文件名,例如: char = d:test.dat; / string ? in.open(, ios:in);,文件流打开文件,选择文件流类 创建流对象 与文件绑定,文件打开模式后述,绝对路径 相对路径,当前项目文件夹,2966,以输入流为例,open 函数原型: void ifstream:open ( const char* , / 文件名 int openmode = ios_base:in / 打开模式 ); 参数 :用 string ? string str; str = . ; ifstream in(str); / C+ 112011 ifstream in(st
13、r.c_str(); / C+ 981998 /或 in.open(str.c_str();,文件流打开文件,const string if( !in ) cout 打开文件失败 ; else cout 打开文件成功 ; 流对象成员函数 fail()=true:打开失败 流对象成员函数 is_open=false:打开失败 fstream in ; in.open( test.dat, ios:in ) if (in.fail() / if (!in.is_open() cout 打开文件失败 ; else cout 打开文件成功 ;,文件流打开文件,3366,文件用完后,应该及时关闭(同时打
14、开的文件数有限) 文件关闭的含义: 解除流对象与文件的绑定关联 解绑后,该流对象还可以与其他文件绑定不删除流对象 举例: ofstream out(demo.txt) ; / out 绑定 demo.txt . ; / 读写文件 . ; / 读写文件 out.close() ; / 用完及时关闭 out.open( test.dat , ios:out | ios:binary ); / out 再与 test.dat 文件关联,文件流关闭文件,3466,C/C+ 文件类型 二进制文件 字节流按字节读写文件 文件数据与内存数据的格式相同。short int16位 : 5678 内存存储: 存入
15、文件 2字节 每个字节不是一个字符 人不能阅读(乱码) 文本文件 字符流按字符读写文件 用某种编码ASCII, UNICODE, GB2312 把内存数据转换为字符后 存入文件。举例:short int : 5678 转换为字符序列 ASCII: 5 6 7 8 转换为字符序列 5678 4字符 写入文件 4字节,文件流准备读写文件,1字节 = 1字符,3566,查看文本文件和二进制文件 用磁盘文件编辑软件WinHex 打开查看: 文本文件 0 x35(5), 0 x36(6),0 x37(7), 0 x38(8) 0 x0D(CR, Carriage Return,回车:回当前行首) 0 x
16、0A( LF, Line Feed,换行) endl, n 二进制文件 存入 short int a=5678 十六进制:0 x162E,文件流准备读写文件,低高,3666,文本文件的读写转换:n 转换 0 x0d(1310):回车到本行首,最初用于打印机 0 x0a(1010):换行到下一行 用0 x0a就够了:换行到下一行行首 Windows保留0 x0d,其他操作系统不保留 节约一字节 写文件 0a 替换为 0d0a 写入文件 读文件 读文件 去掉 0d 存入内存内存中没有0 x0d 文本文件的优缺点 优点:便于人阅读 缺点:字符转换,时空耗费更大,文件流准备读写文件,3766,写入ou
17、tput : 流提取符 与 cout 用法和效果完全一样 cout :操作键盘、屏幕系统绑定 流对象:操作文件自己绑定 操作符 读文本文件的特点 有字符转换 你用文本文件的理由? 不转换:用成员函数 read 后述 读文件二进制 忽略空白字符 作为数据的分隔符 不忽略:用成员函数 get, getline 读文件,读写文本文件,字符转换,3866,读写文本文件,读入内存,观察 n 转换 想想:用还是get 读 ?,3966,读写文本文件,用输出到文件和屏幕 比较:二者结果的异同,4066,读写文本文件,一定要检查文件打开是否成功,方法2:一次性读取文件全部数据,一次性读取文件全部数据需要知道文
18、件大小,怎么知道?,将文件内容显示于屏幕 怎么读文件 test.txt ? 方法多种,下面方法1,4166,【任务要求】矩阵数据文件如图: 从中依序读取每个矩阵并屏显 【存储要求】 文件中存储的矩阵个数可变 矩阵的大小(行列数)可变 元素分隔符为逗号,其前后可有 多个空白字符 矩阵之间可有多个空行 元素还可为浮点数、负数 【编程要求】 自编一个矩阵类实现 按矩阵格式显示,且有行列数 显示一个矩阵后,屏显暂停,综合例:读文本文件,4266,综合例:读文本文件,new,delete,4366,综合例:读文本文件,私有函数,new,4466,综合例:读文本文件,读矩阵的行、列数 怎么跳过分隔符:逗号
19、,读一个矩阵的所有元素到内存 注意:行末尾没逗号,显示一个矩阵 按矩阵形式显示于屏幕,4566,读写二进制文件 任何文件均可用二进制模式打开读写 不要用 读写 字符转换不希望 可以读写模式打开: ios:in | ios:out 文本文件只能其一有效 打开模式必须:ios:binary 缺省为文本模式 fstream in(tem.x, ios:in | ios:out | ios:binary); 常用两个成员函数 buffer :内存块首地址结构体、数组、基本类型等均可 char * :按字节读写 无论什么类型数据 bytes :读写字节数,sizeof() 获得,读写二进制文件,writ
20、e(char*)buffer, int bytes) ; read (char*)buffer, int bytes);,4666,读写二进制文件例:文件拷贝,方案,方案,4766,【例】磁盘文件查看器 将磁盘文件的数据原样读出(不作任何转换),按十六进制和十进制显示。,二进制模式读写文本文件,4866,二进制模式读写文本文件,4966,例:读写二进制文件结构体数组,用多个函数分别实现各自的功能 char name20 改为 string name ; ?,将结构体数组存入文件 从文件读取结构体数组 显示结构体数组的元素,string 的 size 动态变化 不要将其直接写入文件,5066,案
21、例:读写二进制文件结构体数组,一次写入整个数组,一次写入一个字节,一次写入一个元素,一次读入整个数组,5166,随机访问读写 文件 顺序访问文件:从头至尾读写文件 随机访问文件:从文件的任意位置处随机 开始读写 注意:文本文件存在字符转换 文件位置指示符文件指针 文件的当前读写位置 存在于流对象内部 文件读写过程: 每读写一个字节,文件指针前移一个字节 前移:文件头尾方向 移动,随机读写文件文件位置指示符,通过移动位置指示符 以实现任意位置读写,5266,成员函数 移动文件位置指示符到指定位置实现随机读写文件 ostream out : 输出流对象,L 表示long,大小写均可,可省略 移到文
22、件头: 移到文件尾: 获得文件位置 long int tellp(void) / 写文件用 long int tellg(void) / 读文件用 返回值: / long int:232 = 4GB 现在的读写位置 相对于文件头的偏移量字节数 返回值=0: 位于文件头,随机读写文件流成员函数,out.seekp(0,ios:beg),out.seekp(0,ios:end),5466,例:随机读写文本文件,前例的修改,原样显示文件内容,5566,例:随机读写二进制文件,随机读写二进制文件,5666,例:随机读写二进制文件,关键是找到第 No 条 记录在文件中的位置,与上例一样,5766,例:随机读写二
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 透析病人教育手册-透析病人的营养
- 现代农业园区工程企业法律法规及质量管理规范岗前培训试题及答案
- 总质检责任制度
- 房产经理岗位责任制度
- 托育主体责任制度
- 扬尘目标责任制度
- 技术定岗责任制度
- 护士排班责任制度
- 担保人连带责任制度
- 挤奶责任制度
- 小型水库管理员培训
- 蜜雪冰城转让协议合同
- 生产员工劳动安全手册
- DB32∕T 3848-2020 有限空间作业安全操作规范
- 施工现场消防安全技术规范
- 教师师德考核及奖惩制度
- 内蒙地热井施工方案
- 2025年国考国家林草局结构化面试专业题目题库
- 建筑中级职称必背100题
- GB/T 17456.2-2025球墨铸铁管、管件和附件外表面锌基涂层第2部分:带终饰层的富锌涂料涂层
- 高等职业院校教学质量评估指标体系
评论
0/150
提交评论