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页
点击查看更多>>
资源描述
第 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章 流类库与输入 /输出 所谓流 , 是指数据从一个对象流向另一个对象 。 在 C+程序中 , 数据可以从键盘流入到程序中 , 也可 以从程序中流向屏幕或磁盘文件 , 把数据的流动抽象 为 “ 流 ” 。 流在使用前要被建立 , 使用后要被删除 , 还要使用一些特定的操作从流中获取数据或向流中添 加数据 。 从流中获取数据的操作称为提取操作 , 向流 中添加数据的操作称为插入操作 。 第 9章 流类库与输入 /输出 流实际上就是一个字节序列 。 在输入操作中 , 字 节从输入设备 (如键盘 、 磁盘 、 网络连接等 )流向内存; 在输出操作中 , 字节从内存流向输出设备 (如显示器 、 打印机 、 磁盘 、 网络连接等 )。 如图 9-1所示 。 在 C+语言中 , 针对流的特点 , 提供了如图 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:标准错误输出 。 没有缓冲 , 发送给它的内容 立即被输出 , 默认设备为屏幕 。 第 9章 流类库与输入 /输出 clog:标准错误输出 。 有缓冲 , 当缓冲区满时被输 出 , 默认设备为打印机 。 而 istream类通过其派生类 istream_withassign支持预 先定义的对象 。 cin:标准输入。默认设备为键盘。 第 9章 流类库与输入 /输出 2 原理 cout 是 ostream类的全局对象 , 它在头文件 iostream.h中的定义如下: ostream cout(stdout); /这里 , stdout作为该对象构 造时的参数对应每种基本数据类型 , ostream类都存在 友元 , 它们都在 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那样 预先定义的全局对象。文件流类支持对磁盘文件的操 作。要定义一个文件流类对象,须指定文件名和打开 方式。 第 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用于执行文件输入 , 该类有以下几个构造函数: 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-2。 可以用按位 OR( |) 运算符组合 这些标志 , 它们作为枚举器定义在 ios类中 。 第 9章 流类库与输入 /输出 表 9-2 文件打开模式 第 9章 流类库与输入 /输出 打开一个输出文件 , 用于在文件尾添加数据 打开一个现存文件 (用于输入或输出 )并查找到结尾 打开一个输入文件 。 对于一个 ofstream文件 , 使用 ios:in作为一个 openmode, 可避免删除一个现存文件中 现有的内容 打开一个文件 , 用于输出 。 对于所有 ofstream对象 , 此模式是隐含指定的 如果一个文件存在 , 则打开它;否则该操作失败 第 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); fcConstructs an ofstream object.n All ofstream constructors construct a filebuf object. n; 第 9章 流类库与输入 /输出 注意: 这里的文件名要说明其路径 , 要使用双斜杠 , 因为 C+编译器理解单斜杠为字符转换符 。 在文件打开时,匹配了构造函数 ofstream:ofstream(char*),只需要一个文件名,其它为 默认。打开方式默认为 ios:out | ios:trunc,即该文件用 于接受程序的输出。如果该文件已存在,则其内容必 须先清除,否则就新建。 第 9章 流类库与输入 /输出 如果要检查文件是否打开 , 则须判断成员函数 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(str); coutBuf0iNumberfNumber; /从串流中读入一个整数 和浮点数 char*Buf1=new char28; ostrstream outS(Buf1,28); outSiNumber=iNumber ,fNumber=fNumberendl; return Buf1; 第 9章 流类库与输入 /输出 程序运行结果为 iNumber=100,fNumber=123.456 分析:在函数 ioString( )中 , 以 pString为输入设备 , 先定义一个输入串流对象 inS, 从中输入一个整数和一 个浮点数 。 再开辟一个字符串空间作为输出设备 , 定 义一个输出串流对象 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个字符宽按右对齐方式 输出数据 。 从程序的输出结果可以看到 , 在少于 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章 流类库与输入 /输出 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; 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章 流类库与输入 /输出 setw和 width都不截断数值 。 如果一个数值需要比 set(n)确定的字符数更多的字符 , 则该值将使用它所需 要的所有字符 。 当然 , 还要遵守该流的精度设置 。 setw和 width仅影响紧随其后的域 , 即使用 setw和 width 设置的间隔方式并不保留其效力 。 在一个域输出完后 , 域宽度恢复成它的默认值 (必要的宽度 ), 但其它流格 式选项保持有效直到发生改变 。 第 9章 流类库与输入 /输出 例如 , 下面的程序代码: /. cout setiosflags(ios:right) /设置为默认的右对齐方式 , setw(5)1 setw(5)2 setw(5)3endl; 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操纵符关闭左 、 右对 齐标志 。 setiosflags不同于 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成员函数。 其函数原型如下: istream 第 9章 流类库与输入 /输出 其中 , 第一个参数是字符数组 , 用于放置读取的 文本;第二个参数是本次读取的最大字符个数;第三 个参数是分隔字符 , 作为读取一行结束的标志 。 getline成员函数的功能是允许从输入流中读取多 个字符 (包括空白字符和行结束符 ),并且允许指定输 入终止字符 (默认值是换行字符 )。在读取完成后,从 读取的内容中删除该终止字符。 第 9章 流类库与输入 /输出 【 例 9-5】 为输入流指定一个终止字符 。 本程序连续读入一串字符 , 直到遇到字符 t时停止 , 字符个数最多不超过 99个 。 程序中的 t是大小写敏感的 。 #include 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; while(!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.get( 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后输出一个新换行符 。 还可以用 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); input.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章 流类库与输入 /输出 插入运算符的两个参数是对 ostream对象的引用和 对自定义类型 ( 本例中为 PhoneNumber) 的对象的引 用 , 返回对 ostream对象的引用 。 在该程序中 , 重载的 插入运算符按输入格式显示类 PhoneNumber的对象 。 该运算符函数将电话号码各部分显示为字符串 , 因为 它们是以字符串格式存储的 ( 类 istream中的成员函数 getline在结束输入后存储一个空字符 ) 。 第 9章 流类库与输入 /输出 重载的运算符函数在类 PhoneNumber中被声明为友 元函数 。 为了能够访问类中非公有成员 , 重载的输入 和输出运算符必须被声明为类的友元 。 C+允许为用户自定义类型增加新的输入 /输出能 力,而无需修改类 ostream或 istream中的声明和私有数 据成员。这大大提高了 C+的可扩展性。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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