C+程序设计语言揣锦华第9章流类库与输入输出.ppt

上传人:san****019 文档编号:19954973 上传时间:2021-01-18 格式:PPT 页数:62 大小:649.05KB
收藏 版权申诉 举报 下载
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第1页
第1页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第2页
第2页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第3页
第3页 / 共62页
资源描述:

《C+程序设计语言揣锦华第9章流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《C+程序设计语言揣锦华第9章流类库与输入输出.ppt(62页珍藏版)》请在装配图网上搜索。

1、第 9章 流类库与输入 /输出 第 9章 流类库与输入 /输出 9.1 输入 /输出标准流类 9.2 文件流类 9.3 串流类 9.4 控制符 第 9章 流类库与输入 /输出 9.1 输入 /输出标准流类 9.1.1 输入 /输出流的概念 就像 C语言一样 , C+语言中也没有输入 /输出语句 。 C+的 I/O是以字节流的形式实现的 , 每一个 C+编译 系统都带有一个面向对象的输入 /输出软件包 , 这就是 I/O流类库 。 其中 , 流是 I/O流类的中心概念 。 到目前为 止 , 我们一直在使用它 。 第 9章 流类库与输入 /输出 所谓流 , 是指数据从一个对象流向另一个对象 。 在

2、 C+程序中 , 数据可以从键盘流入到程序中 , 也可 以从程序中流向屏幕或磁盘文件 , 把数据的流动抽象 为 “ 流 ” 。 流在使用前要被建立 , 使用后要被删除 , 还要使用一些特定的操作从流中获取数据或向流中添 加数据 。 从流中获取数据的操作称为提取操作 , 向流 中添加数据的操作称为插入操作 。 第 9章 流类库与输入 /输出 流实际上就是一个字节序列 。 在输入操作中 , 字 节从输入设备 (如键盘 、 磁盘 、 网络连接等 )流向内存; 在输出操作中 , 字节从内存流向输出设备 (如显示器 、 打印机 、 磁盘 、 网络连接等 )。 如图 9-1所示 。 在 C+语言中 , 针

3、对流的特点 , 提供了如图 9-2所 示的层次结构来描述流的行为 , 并给出了 I/O流类库的 操作 。 第 9章 流类库与输入 /输出 第 9章 流类库与输入 /输出 图 9-2 输入 /输出流类层次图 第 9章 流类库与输入 /输出 表 9-1 I/O流类列表 第 9章 流类库与输入 /输出 9.1.2 输入 /输出标准流类 1 标准流的设备名 由表 9-1可见 , I/O流的标准头文件是 iostream.h。 其 中 , ostream类通过其派生类 ostream_withassign支持以 下预先定义的流对象: cout:标准输出 。 默认设备为屏幕 。 cerr:标准错误输出 。

4、 没有缓冲 , 发送给它的内容 立即被输出 , 默认设备为屏幕 。 第 9章 流类库与输入 /输出 clog:标准错误输出 。 有缓冲 , 当缓冲区满时被输 出 , 默认设备为打印机 。 而 istream类通过其派生类 istream_withassign支持预 先定义的对象 。 cin:标准输入。默认设备为键盘。 第 9章 流类库与输入 /输出 2 原理 cout 是 ostream类的全局对象 , 它在头文件 iostream.h中的定义如下: ostream cout(stdout); /这里 , stdout作为该对象构 造时的参数对应每种基本数据类型 , ostream类都存在 友

5、元 , 它们都在 iostream.h中声明 。 例如: ostream ostream ostream /. 第 9章 流类库与输入 /输出 如语句: coutHow old are you? ; cout是类 ostream的对象 , ( int istream istream /. 第 9章 流类库与输入 /输出 9.2 文件流类 fstream、 ifstream和 ofstream是文件流类,在头文件 fstream.h中定义。其中, fstream是 ofstream和 ifstream多 重继承的子类。文件流类不是标准设备,没有 cout那样 预先定义的全局对象。文件流类支持对磁

6、盘文件的操 作。要定义一个文件流类对象,须指定文件名和打开 方式。 第 9章 流类库与输入 /输出 类 ofstream用于执行文件输出 , 该类有以下几个构造函数: ofstream:ofstream( filedesc fd ); ofstream:ofstream( filedesc fd, char*pch, int nLength ); ofstream:ofstream( const char*szName, int nMode = ios:out, int nProt = filebuf:openprot ); 第 9章 流类库与输入 /输出 类 ifstream用于执行文件输入

7、 , 该类有以下几个构造函数: ifstream:ifstream( filedesc fd ); ifstream:ifstream( filedesc fd, char*pch, int nLength ); ifstream:ifstream( const char*szName, int nMode = ios:in, int nProt = filebuf:openprot ); 第 9章 流类库与输入 /输出 其中最常用的都是最后一个构造函数 。 该函数有 三个参数 , 第一个参数是指向要打开的文件名的字符 串 , 后两个参数指定文件的打开模式 。 文件打开模式 的具体标志见表 9

8、-2。 可以用按位 OR( |) 运算符组合 这些标志 , 它们作为枚举器定义在 ios类中 。 第 9章 流类库与输入 /输出 表 9-2 文件打开模式 第 9章 流类库与输入 /输出 打开一个输出文件 , 用于在文件尾添加数据 打开一个现存文件 (用于输入或输出 )并查找到结尾 打开一个输入文件 。 对于一个 ofstream文件 , 使用 ios:in作为一个 openmode, 可避免删除一个现存文件中 现有的内容 打开一个文件 , 用于输出 。 对于所有 ofstream对象 , 此模式是隐含指定的 如果一个文件存在 , 则打开它;否则该操作失败 第 9章 流类库与输入 /输出 如果

9、一个文件不存在 , 则作为新文件打开它;如 果文件已存在 , 则该操作失败 打开一个文件 。 如果它已经存在 , 则删除其中原 有的内容 。 如果指定了 ios:out, 但没有指定 ios:ate、 ios:app和 ios:in, 则隐含为此模式 以二进制模式打开一个文件 (默认是文本模式 ) Nprot是文件保护方式 , 它的标志如表 9-3。 第 9章 流类库与输入 /输出 表 9-3 文件保护方式 第 9章 流类库与输入 /输出 【 例 9-1】 向文件 myfile中写入一些信息 。 #include void main( ) ofstream fc(c:tempmyfile);

10、fcConstructs an ofstream object.n All ofstream constructors construct a filebuf object. n; 第 9章 流类库与输入 /输出 注意: 这里的文件名要说明其路径 , 要使用双斜杠 , 因为 C+编译器理解单斜杠为字符转换符 。 在文件打开时,匹配了构造函数 ofstream:ofstream(char*),只需要一个文件名,其它为 默认。打开方式默认为 ios:out | ios:trunc,即该文件用 于接受程序的输出。如果该文件已存在,则其内容必 须先清除,否则就新建。 第 9章 流类库与输入 /输出 如

11、果要检查文件是否打开 , 则须判断成员函数 fail( ): #include void func( ) ofstream fc(myfile); if(fc.fail( ) /fail( )= =1 cerrerror opening filen; return; fca; coutaendl; 输出结果为 H 第 9章 流类库与输入 /输出 【 例 9-2】 使用串流输入对字符串中的数据进行解读 。 #include #include char*ioString(char*); void main( ) char*str=100 123.456; char*Buf0=ioString(st

12、r); coutBuf0iNumberfNumber; /从串流中读入一个整数 和浮点数 char*Buf1=new char28; ostrstream outS(Buf1,28); outSiNumber=iNumber ,fNumber=fNumberendl; return Buf1; 第 9章 流类库与输入 /输出 程序运行结果为 iNumber=100,fNumber=123.456 分析:在函数 ioString( )中 , 以 pString为输入设备 , 先定义一个输入串流对象 inS, 从中输入一个整数和一 个浮点数 。 再开辟一个字符串空间作为输出设备 , 定 义一个输出

13、串流对象 outS, 将从输入设备输入的两个 变量的值输出 。 第 9章 流类库与输入 /输出 9.4 控制符 9.4.1 使用流对象的成员函数 【 例 9-3】 使用 width成员函数控制输出宽度 。 #include void main( ) double values =1.44,36.47,625.7,4096.24; for(int i=0;i4;i+) 第 9章 流类库与输入 /输出 cout.width(10); coutvaluesin; 程序运行结果为 1.44 36.47 625.7 4096.24 第 9章 流类库与输入 /输出 此例子在一列中以至少 10个字符宽按右对

14、齐方式 输出数据 。 从程序的输出结果可以看到 , 在少于 10个 字符宽的数值前加入了引导空格 。 空格是默认的填充符 , 当输出的数据不能充满指 定的宽度时 , 系统会自动以空格填充 。 另外 , 还可以 使用 fill成员函数为已经指定宽度的域设置填充字符的 值 。 为了用星号填充数值列 , 我们可以将例 9-3中的 for 循环修改如下: 第 9章 流类库与输入 /输出 for(int i=0;i4;i+) cout.width(10); cout.fill(*); coutvaluesiendl; 其输出结果为 *1.44 *36.47 *625.7 *4096.24 第 9章 流类

15、库与输入 /输出 9.4.2 使用控制符 C+的输入 /输出流类库提供了一些控制符 , 可以 直接嵌入到输入 /输出语句中来实现对 I/O格式的控制 。 它的优点是程序可以直接将控制符插入流中 , 而不必 单独调用 。 表 9-4中列出了常用的 I/O流类库控制符 。 第 9章 流类库与输入 /输出 表 9-4 常用的 I/O流类库控制符 第 9章 流类库与输入 /输出 第 9章 流类库与输入 /输出 【 例 9-4】 使用 setw控制符指定宽度 。 #include #include void main( ) double values =1.44,36.47,625.7,4096.24;

16、 char*names =Rose,John,Alice,Mary; for(int i=0;i4;i+) 第 9章 流类库与输入 /输出 coutsetw(6)namesisetw(10)valuesiendl; width成员函数在头文件 iostream.h中说明 。 如果 带参量使用 setw(n)或任何其它控制符 , 还必须包括头 文件 iomanip.h。 在输出中 , 字符串输出在宽度为 6的域 中 , 整数输出在宽度为 10的域中 。 程序运行结果为 Rose 1.44 John 36.47 Alice 625.7 Mary 4096.24 第 9章 流类库与输入 /输出 se

17、tw和 width都不截断数值 。 如果一个数值需要比 set(n)确定的字符数更多的字符 , 则该值将使用它所需 要的所有字符 。 当然 , 还要遵守该流的精度设置 。 setw和 width仅影响紧随其后的域 , 即使用 setw和 width 设置的间隔方式并不保留其效力 。 在一个域输出完后 , 域宽度恢复成它的默认值 (必要的宽度 ), 但其它流格 式选项保持有效直到发生改变 。 第 9章 流类库与输入 /输出 例如 , 下面的程序代码: /. cout setiosflags(ios:right) /设置为默认的右对齐方式 , setw(5)1 setw(5)2 setw(5)3e

18、ndl; cout setiosflags(ios:left) /设置成左对齐方式 第 9章 流类库与输入 /输出 setw(5)1 setw(5)2 setw(5)3endl; coutresetiosflags(ios:left) /关闭左对齐标志 /. 这段程序代码中,是通过使用带参数的 setiosflags 控制符来设置左、右对齐,参数是 ios:left和 ios:right枚 举器。 第 9章 流类库与输入 /输出 该枚举器定义在 ios类中 , 因此 , 引用时必须包括 ios:前缀 。 这里需要用 resctiosflags操纵符关闭左 、 右对 齐标志 。 setiosfl

19、ags不同于 width和 setw, 它的影响是持 久的 , 直到用 resetiosflags重新恢复默认值时为止 。 这段程序代码的输出结果为 1 2 3 1 2 3 常用控制符和流格式控制成员函数如表 9-5所示。 第 9章 流类库与输入 /输出 表 9-5 常用控制符和流成员函数 第 9章 流类库与输入 /输出 9.5 输入 /输出成员函数 9.5.1 使用成员函数输入 1 getline( )函数 在程序使用 cin输入时, cin用空白符和行结束符将 各个值分开。有时候输入可能需要读取一整行文本并 且分开不同的域,为此,我们可以使用 getline成员函数。 其函数原型如下: i

20、stream 第 9章 流类库与输入 /输出 其中 , 第一个参数是字符数组 , 用于放置读取的 文本;第二个参数是本次读取的最大字符个数;第三 个参数是分隔字符 , 作为读取一行结束的标志 。 getline成员函数的功能是允许从输入流中读取多 个字符 (包括空白字符和行结束符 ),并且允许指定输 入终止字符 (默认值是换行字符 )。在读取完成后,从 读取的内容中删除该终止字符。 第 9章 流类库与输入 /输出 【 例 9-5】 为输入流指定一个终止字符 。 本程序连续读入一串字符 , 直到遇到字符 t时停止 , 字符个数最多不超过 99个 。 程序中的 t是大小写敏感的 。 #includ

21、e void main( ) char line100; coutType a line terminated by tendl; cin.getline(line,100,t); coutlineendl; 第 9章 流类库与输入 /输出 2 get( )函数 在输入时 , 有些时候需要执行每次只输入单个字符 的操作 , 我们可以使用 get( )成员函数来完成 。 get( )函数 的格式如下: char istream:get( ); 【 例 9-6】 循环读入字符 , 直到键入一个 y字符 , 或 遇到文件尾 。 #include void main( ) char letter; w

22、hile(!cin.eof( ) 第 9章 流类库与输入 /输出 letter=cin.get( ); if(letter=y) coutybe met!; break; coutletter; 第 9章 流类库与输入 /输出 get( )函数还有一种形式可以输入一系列字符 , 直 到输入流中出现结束符或所读字符个数已达到要求读 的字符个数 。 这时 , get( )函数的函数原型如下: istream 第 9章 流类库与输入 /输出 例如 , 下面程序输入一系列字符 , 将前 24个字符输出 。 #include void main( ) char line25; cout ; cin.ge

23、t( line, 25 ); cout line; 第 9章 流类库与输入 /输出 9.5.2 使用成员函数输出 【 例 9-7】 使用 put( )成员函数 , 在屏幕上显示字母 表中的字母 。 #include void main( ) char letter; for(letter=A;letter=Z;letter+) cout.put(letter); 第 9章 流类库与输入 /输出 程序运行结果为 ABCDEFGHIJKMNOPQRSTUVWXYZ 也可以像下面那样在一条语句中连续调用 put( )函数: cout.put(A).put(n); 该语句在输出字符 A后输出一个新换行

24、符 。 还可以用 ASCII码值表达式调用 put( )函数: cout.put(65); 该语句也输出字符 A。 第 9章 流类库与输入 /输出 9.6 用户自定义类型的输入 /输出 【 例 9-8】 用户自定义的插入运算符和提取运算符 。 #include class PhoneNumber private: char nationCode4; char areaCode4; char phoneCode8; 第 9章 流类库与输入 /输出 public: friend ostream ; ostream /跳过 ( input.getline(num.nationCode,4); inp

25、ut.ignore( ); /跳过 ) input.getline(num.areaCode,4); input.ignore( ); /跳过 - input.getline(num.phoneCode,8); return input; 第 9章 流类库与输入 /输出 void main( ) PhoneNumber phone; coutEnter a telephone number in the phone; coutThe phone number entered was:n phonephone1phone2; 第 9章 流类库与输入 /输出 插入运算符的两个参数是对 ostrea

26、m对象的引用和 对自定义类型 ( 本例中为 PhoneNumber) 的对象的引 用 , 返回对 ostream对象的引用 。 在该程序中 , 重载的 插入运算符按输入格式显示类 PhoneNumber的对象 。 该运算符函数将电话号码各部分显示为字符串 , 因为 它们是以字符串格式存储的 ( 类 istream中的成员函数 getline在结束输入后存储一个空字符 ) 。 第 9章 流类库与输入 /输出 重载的运算符函数在类 PhoneNumber中被声明为友 元函数 。 为了能够访问类中非公有成员 , 重载的输入 和输出运算符必须被声明为类的友元 。 C+允许为用户自定义类型增加新的输入 /输出能 力,而无需修改类 ostream或 istream中的声明和私有数 据成员。这大大提高了 C+的可扩展性。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!