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

上传人:max****ui 文档编号:10962850 上传时间:2020-04-16 格式:PPT 页数:62 大小:649KB
返回 下载 相关 举报
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第1页
第1页 / 共62页
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第2页
第2页 / 共62页
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第3页
第3页 / 共62页
点击查看更多>>
资源描述
第9章流类库与输入 输出 9 1输入 输出标准流类9 2文件流类9 3串流类9 4控制符 9 1输入 输出标准流类 9 1 1输入 输出流的概念就像C语言一样 C 语言中也没有输入 输出语句 C 的I O是以字节流的形式实现的 每一个C 编译系统都带有一个面向对象的输入 输出软件包 这就是I O流类库 其中 流是I O流类的中心概念 到目前为止 我们一直在使用它 所谓流 是指数据从一个对象流向另一个对象 在C 程序中 数据可以从键盘流入到程序中 也可以从程序中流向屏幕或磁盘文件 把数据的流动抽象为 流 流在使用前要被建立 使用后要被删除 还要使用一些特定的操作从流中获取数据或向流中添加数据 从流中获取数据的操作称为提取操作 向流中添加数据的操作称为插入操作 流实际上就是一个字节序列 在输入操作中 字节从输入设备 如键盘 磁盘 网络连接等 流向内存 在输出操作中 字节从内存流向输出设备 如显示器 打印机 磁盘 网络连接等 如图9 1所示 在C 语言中 针对流的特点 提供了如图9 2所示的层次结构来描述流的行为 并给出了I O流类库的操作 图9 2输入 输出流类层次图 表9 1I O流类列表 9 1 2输入 输出标准流类1 标准流的设备名由表9 1可见 I O流的标准头文件是iostream h 其中 ostream类通过其派生类ostream withassign支持以下预先定义的流对象 cout 标准输出 默认设备为屏幕 cerr 标准错误输出 没有缓冲 发送给它的内容立即被输出 默认设备为屏幕 clog 标准错误输出 有缓冲 当缓冲区满时被输出 默认设备为打印机 而istream类通过其派生类istream withassign支持预先定义的对象 cin 标准输入 默认设备为键盘 2 原理cout是ostream类的全局对象 它在头文件iostream h中的定义如下 ostreamcout stdout 这里 stdout作为该对象构造时的参数对应每种基本数据类型 ostream类都存在友元 它们都在iostream h中声明 例如 ostream 如语句 cout int 9 2文件流类 fstream ifstream和ofstream是文件流类 在头文件fstream h中定义 其中 fstream是ofstream和ifstream多重继承的子类 文件流类不是标准设备 没有cout那样预先定义的全局对象 文件流类支持对磁盘文件的操作 要定义一个文件流类对象 须指定文件名和打开方式 类ofstream用于执行文件输出 该类有以下几个构造函数 ofstream ofstream filedescfd ofstream ofstream filedescfd char pch intnLength ofstream ofstream constchar szName intnMode ios out intnProt filebuf openprot 类ifstream用于执行文件输入 该类有以下几个构造函数 ifstream ifstream filedescfd ifstream ifstream filedescfd char pch intnLength ifstream ifstream constchar szName intnMode ios in intnProt filebuf openprot 其中最常用的都是最后一个构造函数 该函数有三个参数 第一个参数是指向要打开的文件名的字符串 后两个参数指定文件的打开模式 文件打开模式的具体标志见表9 2 可以用按位OR 运算符组合这些标志 它们作为枚举器定义在ios类中 表9 2文件打开模式 打开一个输出文件 用于在文件尾添加数据打开一个现存文件 用于输入或输出 并查找到结尾打开一个输入文件 对于一个ofstream文件 使用ios in作为一个openmode 可避免删除一个现存文件中现有的内容打开一个文件 用于输出 对于所有ofstream对象 此模式是隐含指定的如果一个文件存在 则打开它 否则该操作失败 如果一个文件不存在 则作为新文件打开它 如果文件已存在 则该操作失败打开一个文件 如果它已经存在 则删除其中原有的内容 如果指定了ios out 但没有指定ios ate ios app和ios in 则隐含为此模式以二进制模式打开一个文件 默认是文本模式 Nprot是文件保护方式 它的标志如表9 3 表9 3文件保护方式 例9 1 向文件myfile中写入一些信息 includevoidmain ofstreamfc c temp myfile fc Constructsanofstreamobject n Allofstreamconstructorsconstructafilebufobject n 注意 这里的文件名要说明其路径 要使用双斜杠 因为C 编译器理解单斜杠为字符转换符 在文件打开时 匹配了构造函数ofstream ofstream char 只需要一个文件名 其它为默认 打开方式默认为ios out ios trunc 即该文件用于接受程序的输出 如果该文件已存在 则其内容必须先清除 否则就新建 如果要检查文件是否打开 则须判断成员函数fail includevoidfunc ofstreamfc myfile if fc fail fail 1 cerr erroropeningfile n return fc 若要打开一个输入文件 则有 ifstreamfc myfile ios nocreate 当然 也可以通过检查fc fail 来确定文件打开是否出错 如果要打开一个同时用于输入和输出的文件 则有 fstreamfc myfile ios in ios out 9 3串流类 strstream istrstream和ostrstream是串流类 在头文件strstrea h中定义 其中 strstream是istrstream和ostrstream多重继承的子类 同样 串流类也不是标准设备 它没有cout那样预先定义的全局对象 串流类允许将fstream类定义的文件操作应用于存储区中的字符串 即将字符串看作为设备 要定义一个串流类对象 须提供字符数组和数组大小 类ostrstream用于执行串流输出 该类有以下几个构造函数 ostrstream ostrstream char pch intnLength intnMode ios out 其中比较常用的是第二个构造函数 它有三个参数 第一个参数指出字符数组 第二个参数说明数组的大小 第三个参数指出打开方式 类istrstream用于执行串流输入 该类有以下几个构造函数 istrstream char pch istrstream char pch intnLength 这两个构造函数都比较常用 Char pch参数指出了字符数组 intnLength参数说明数组的大小 当nLength为0时 表示把istrstream类对象连接到由pch指向的以空字符结束的字符串 例如 下面的程序代码定义一个串流类对象 并对其进行输入操作 charstr 50 Howareyou n chara istrstreamss str ss a cout a endl 输出结果为H 例9 2 使用串流输入对字符串中的数据进行解读 include includechar ioString char voidmain char str 100123 456 char Buf0 ioString str cout Buf0 endl char ioString char pString istrstreaminS pString 0 以ios in方式intiNumber floatfNumber inS iNumber fNumber 从串流中读入一个整数和浮点数char Buf1 newchar 28 ostrstreamoutS Buf1 28 outS iNumber iNumber fNumber fNumber endl returnBuf1 程序运行结果为iNumber 100 fNumber 123 456分析 在函数ioString 中 以pString为输入设备 先定义一个输入串流对象inS 从中输入一个整数和一个浮点数 再开辟一个字符串空间作为输出设备 定义一个输出串流对象outS 将从输入设备输入的两个变量的值输出 9 4控制符 9 4 1使用流对象的成员函数 例9 3 使用width成员函数控制输出宽度 includevoidmain doublevalues 1 44 36 47 625 7 4096 24 for inti 0 i 4 i cout width 10 cout values i n 程序运行结果为1 4436 47625 74096 24 此例子在一列中以至少10个字符宽按右对齐方式输出数据 从程序的输出结果可以看到 在少于10个字符宽的数值前加入了引导空格 空格是默认的填充符 当输出的数据不能充满指定的宽度时 系统会自动以空格填充 另外 还可以使用fill成员函数为已经指定宽度的域设置填充字符的值 为了用星号填充数值列 我们可以将例9 3中的for循环修改如下 for inti 0 i 4 i cout width 10 cout fill cout values i endl 其输出结果为 1 44 36 47 625 7 4096 24 9 4 2使用控制符C 的输入 输出流类库提供了一些控制符 可以直接嵌入到输入 输出语句中来实现对I O格式的控制 它的优点是程序可以直接将控制符插入流中 而不必单独调用 表9 4中列出了常用的I O流类库控制符 表9 4常用的I O流类库控制符 例9 4 使用setw控制符指定宽度 include includevoidmain doublevalues 1 44 36 47 625 7 4096 24 char names Rose John Alice Mary for inti 0 i 4 i cout setw 6 names i setw 10 values i endl width成员函数在头文件iostream h中说明 如果带参量使用setw n 或任何其它控制符 还必须包括头文件iomanip h 在输出中 字符串输出在宽度为6的域中 整数输出在宽度为10的域中 程序运行结果为Rose1 44John36 47Alice625 7Mary4096 24 setw和width都不截断数值 如果一个数值需要比set n 确定的字符数更多的字符 则该值将使用它所需要的所有字符 当然 还要遵守该流的精度设置 setw和width仅影响紧随其后的域 即使用setw和width设置的间隔方式并不保留其效力 在一个域输出完后 域宽度恢复成它的默认值 必要的宽度 但其它流格式选项保持有效直到发生改变 例如 下面的程序代码 cout setiosflags ios right 设置为默认的右对齐方式 setw 5 1 setw 5 2 setw 5 3 endl cout setiosflags ios left 设置成左对齐方式 setw 5 1 setw 5 2 setw 5 3 endl cout resetiosflags ios left 关闭左对齐标志 这段程序代码中 是通过使用带参数的setiosflags控制符来设置左 右对齐 参数是ios left和ios right枚举器 该枚举器定义在ios类中 因此 引用时必须包括ios 前缀 这里需要用resctiosflags操纵符关闭左 右对齐标志 setiosflags不同于width和setw 它的影响是持久的 直到用resetiosflags重新恢复默认值时为止 这段程序代码的输出结果为123123常用控制符和流格式控制成员函数如表9 5所示 表9 5常用控制符和流成员函数 9 5输入 输出成员函数 9 5 1使用成员函数输入1 getline 函数在程序使用cin输入时 cin用空白符和行结束符将各个值分开 有时候输入可能需要读取一整行文本并且分开不同的域 为此 我们可以使用getline成员函数 其函数原型如下 istream 其中 第一个参数是字符数组 用于放置读取的文本 第二个参数是本次读取的最大字符个数 第三个参数是分隔字符 作为读取一行结束的标志 getline成员函数的功能是允许从输入流中读取多个字符 包括空白字符和行结束符 并且允许指定输入终止字符 默认值是换行字符 在读取完成后 从读取的内容中删除该终止字符 例9 5 为输入流指定一个终止字符 本程序连续读入一串字符 直到遇到字符t时停止 字符个数最多不超过99个 程序中的t是大小写敏感的 includevoidmain charline 100 cout Typealineterminatedby t endl cin getline line 100 t cout line endl 2 get 函数在输入时 有些时候需要执行每次只输入单个字符的操作 我们可以使用get 成员函数来完成 get 函数的格式如下 charistream get 例9 6 循环读入字符 直到键入一个y字符 或遇到文件尾 includevoidmain charletter while cin eof letter cin get if letter y cout y bemet break cout letter get 函数还有一种形式可以输入一系列字符 直到输入流中出现结束符或所读字符个数已达到要求读的字符个数 这时 get 函数的函数原型如下 istream 例如 下面程序输入一系列字符 将前24个字符输出 includevoidmain charline 25 cout cin get line 25 cout line 9 5 2使用成员函数输出 例9 7 使用put 成员函数 在屏幕上显示字母表中的字母 includevoidmain charletter for letter A letter Z letter cout put letter 程序运行结果为ABCDEFGHIJKMNOPQRSTUVWXYZ也可以像下面那样在一条语句中连续调用put 函数 cout put A put n 该语句在输出字符A后输出一个新换行符 还可以用ASCII码值表达式调用put 函数 cout put 65 该语句也输出字符A 9 6用户自定义类型的输入 输出 例9 8 用户自定义的插入运算符和提取运算符 includeclassPhoneNumber private charnationCode 4 charareaCode 4 charphoneCode 8 public friendostream istream voidmain PhoneNumberphone cout phone cout Thephonenumberenteredwas n phone endl 程序运行结果为输入 086 029 1234567Thephonenumberenteredwas 086 029 1234567该程序为处理用户自定义的电话号码类PhoneNumber的数据重载了这两个运算符 另外 该程序假定电话号码的输入是正确的 提取运算符的参数是对istream对象的引用和对自定义类型对象的引用 返回对istream对象的引用 在该程序中 重载的提取运算符用于把形如 086 029 5261111的电话号码输入到PhoneNumber类型的对象中 运算符函数分别将电话号码的三个部分分别读到被引用的PhoneNumber对象的成员nationCode areaCode和phoneCode中 在运算符函数中 被引用对象是num 在main函数中 被引用对象是phone 调用成员函数ignore 去掉了括号和破折号 运算符函数返回istream 插入运算符的两个参数是对ostream对象的引用和对自定义类型 本例中为PhoneNumber 的对象的引用 返回对ostream对象的引用 在该程序中 重载的插入运算符按输入格式显示类PhoneNumber的对象 该运算符函数将电话号码各部分显示为字符串 因为它们是以字符串格式存储的 类istream中的成员函数getline在结束输入后存储一个空字符 重载的运算符函数在类PhoneNumber中被声明为友元函数 为了能够访问类中非公有成员 重载的输入和输出运算符必须被声明为类的友元 C 允许为用户自定义类型增加新的输入 输出能力 而无需修改类ostream或istream中的声明和私有数据成员 这大大提高了C 的可扩展性
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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