C++输入输出流_第1页
C++输入输出流_第2页
C++输入输出流_第3页
C++输入输出流_第4页
C++输入输出流_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第10章输入输出流 2 本章学习要求 流的概念C 中I O处理类层次结构基于控制台 文件以及字符串的I O处理 3 10 1流 4 10 1 1流的概念 计算机中的数据从一个设备到另一个设备的传输 我们就称为数据流 可以想象数据是从一个设备流向另一个设备 输入 输出的任务实际上就是以一种稳定 可靠的方式在任何设备与内存之间传输数据流 从内存输出到设备的数据流称为输出流 Outputstream 从设备输入到内存的数据流称为输入流 Inputstream 5 10 1 2I O流的层次结构 程序尽量不要直接和千变万化的外部存储设备打交道 按照如此想法设计的输入 输出的逻辑结构如图10 1所示 输入输出的逻辑结构 传输管道内传输的是字节流 因为任何数据都是以字节为单位保存的 传输管道的左边负责将字节流转换成各种类型的值保存到内存变量 或将内存变量值转换成字节流 传输管道的右边负责将字节流交给外部设备 或将外部设备存储的数据转换成字节流放到管道中 外部设备不关心传递过来的数据是什么类型 只是按照自己的方式将一个个字节保存起来 传输管道的右边负责和具体的外部设备交互 它也不需要知道设备是如何存储数据 只要知道如何将字节流交给外部设备即可 6 若将传输管道看作实现I O功能的流对象 则一个流对象结构上可以分为两层 格式化层和传递层 如图10 2所示 格式化层 进行格式化或解析 例如将数据由内存表示转换成指定格式的字节表示 或将字节表示转换成内存中变量格式 传递层 负责缓冲 编码转换和将字符序列传递到外部设备或从外部设备读入字符流 格式化层的主要任务是在输入时负责解析从外部设备读入的字节流 而在输出时负责格式化和产生能输出到外部设备字节流 7 10 2C I O类库概览 8 10 2 1C I O类库层次结构 C 流类层次结构中 除了ios base类外 其他的流类几乎都是模板类 C 中流类层次结构如图所示 9 10 2 2I O基本类的成员及功能 1 ios baseios base类是非模板类 该类定义了一些输入 输出流类中都具有的函数 以及输出 输出过程中使用的状态标志 2 iosios类定义了一些基础的输入 输出功能 3 istreamistream类定义用来实现输入的基本功能 所有其他实现从具体外部设备输入的流类都必须从其继承 4 ostreamostream类定义用来实现输出的基本功能 所有其他实现向具体外部设备输出的流类都必须从其继承 5 操纵符操纵符 manipulator 也称为控制器函数 是为了简化对I O流的格式设置和简化流的常用操作而定义的一些inline函数 通过调用这些函数可以设置对应流的输出格式 要在程序中使用操纵符 必须采用 include指令来包含iomanip头文件 10 10 3基于I O类库的控制台I O C I O类库中预定义了四个控制台I O对象cin cout cerror和clog 含义如表所示 利用这些对象可以直接进行控制台的输入 输出 其中cin对应着计算机系统的标准输入设备 通常为键盘 cerr以及clog对应着计算机系统的用于输出信息的设备 通常情况下为显示器 基于控制台的I O 需要包含下列指令 include 11 10 3 1控制台输出 1 基本数据类型的输出ostream类重载了 操作符提供对基本数据类型数据输出的支持 例向控制台输出基本数据类型变量的值 includeusingnamespacestd intmain charch a shorts 100 inti 200 longl 1000 unsignedshortus 234 floatf 3 23 doubledf 1 55 charstr C IOisveryeasy cout ch endl cout s endl cout i endl cout l endl cout us endl cout f endl cout df endl cout 12 2 格式化输出数据通常需要按照某种预定义的报表格式进行输出 下面介绍C I O中常见的格式控制 C 中的格式化输出通过设置某些标志进行控制 C 已经定义一些操纵符来简化某些格式标记的设置 下面的演示程序以操纵符的使用为主 1 整数输出通过操纵符hex oct dec来实现输出的基数的控制 例采用十进制 十六进制 八进制分别显示一个整数 include includeusingnamespacestd intmain intx 100 cout x endl 默认采用十进制输出cout hex x endl 采用十六进制输出cout showbase oct x endl 采用八进制输出 并输出前缀0cout dec x endl 采用十进制输出return1 13 2 浮点数输出浮点数字的输出可以采用定点格式和科学计数法两种 采用操纵符fixed scientific来控制 同时可以通过setprecision来设置浮点数的精度 例分别以定点数和科学计数法输出浮点数 include includeusingnamespacestd intmain doublef 94 873 cout fixed f 以定点格式输出 带小数点cout scientific f endl 科学计数法 setprecision 2 设置小数点后有2位有效数cout setprecision 2 fixed f scientific f endl 14 3 布尔类型输出布尔类型的数据输出可以采用两种方式 字符串 输出true或false 数字 输出表示真的1或表示假的0 分别采用boolalpha和noboolalpha操纵符来选择这两种方式 例分别采用字符和数字方式输出布尔值 include includeusingnamespacestd intmain boolb1 true b2 false cout b1 b2 endl cout boolalpha b1 b2 endl cout noboolalpha b1 b2 endl 15 4 控制输出宽度有时在发票上 了使打印机输出的内容和发票的样式能够对应上 需要使输出项的输出宽度不小于某个宽度 若输出项自身的宽度大于指定的宽度 则使用输出项自身的宽度 输出宽度的设置可以通过操作符setw 例将学生姓名和成绩按照上下对齐方式打印 include includeusingnamespacestd intmain doublevalues 89 5 78 92 5 84 char names Zoot Jimmy Allen Stan for inti 0 i 4 i cout setw 10 names i setw 10 values i endl 16 5 对齐上例中输出项默认都是靠左边对齐的 可以通过left right等控制输出项的对齐方式 如10 5中的输出语句改为 cout left setw 10 names i setw 6 values i endl 17 6 填充字符可以使用fill操纵符来指定在指定宽度的输出中 采用的填充字符 默认的为空格 例将姓名和成绩按照固定宽度对齐输出 并利用 填充空白部分 include includeusingnamespacestd intmain doublevalues 89 5 78 92 5 84 char names Zoot Jimmy Allen Stan cout fill for inti 0 i 4 i cout setw 10 names i setw 10 values i endl 18 3 其他输出函数C 中 除了使用 操作符实现输出功能以外 也可以使用输出流对象的put write函数实现数据的输出 函数原型见表10 5 这些成员函数既可用于ASCII文本流 也可用于二进制流 尤其适用于二进制流输出 例使用put函数输出数据 includeusingnamespacestd intmain cout a b n cout put a cout put cout put b cout put n charc1 A c2 B cout put c1 cout put cout put c2 19 例使用write函数输出数据 includeusingnamespacestd voidPrintString char s cout write s strlen s put n write返回的是一个输出流对象cout write s 6 n intmain charstr Iloveyou cout Thestringis str endl PrintString str PrintString thisisastring 20 10 3 2控制台输入 C 中通常使用提取操作符 来实现数据的输入 使用 运算符输入数据时 系统跳过开头空白符 包括 空格 制表符 t 换行符 n 流结束符 然后提取待输入数据类型中所具有的符号 1 整数输入使用 输入整数时 系统跳过开头的空白字符然后读取一个数字 直到遇到非数字字符 整数的输入可以采用十进制 八进制 十六进制三种格式 例采用十进展制 十六进制 八进制输入整数 include includeusingnamespacestd intmain intx y z cin x 默认输入流中的整型数据为10进制格式cin hex 设置输入流中的整型数据为16进制格式cin y cin oct z 采用8进制输入整数值cout x y z 默认采用十进制输出数值 21 2 浮点数输入浮点数的输入可以采用定点数和科学计数法两种格式 例输入浮点数 include includeusingnamespacestd intmain doubled d1 d2 floatf f1 f2 cin d f 默认输入的数字是浮点数格式cin scientific 指定输入的数字是科学计数法格式cin d1 f1 cin fixed d2 f2 指定输入的数字是浮点数格式 默认采用定点数格式输出cout d d1 d2 endl cout f f1 f2 22 3 布尔类型的输入布尔类型的输入可以采用两种格式 字符方式 true和false 数字方式 1和0 例输入布尔类型值 include includeusingnamespacestd intmain boolb1 b2 b3 b4 cin boolalpha 设置输入的布尔值是true或false格式的cin b1 b2 cin noboolalpha b3 b4 设置输入的布尔值是1或0格式的 默认采用数字方式输出布尔值cout b1 b2 b3 b4 cout boolalpha 采用true或false格式输出布尔值cout b1 b2 b3 b4 endl 23 4 字符串的输入字符串输入与其他类型数据的输入有些不同 因为字符串没有特别的格式说明 当利用抽取符 从输入流抽取字符串时 有两种终止方式 遇到空白字符 如果使用setw时 只能抽取固定数目的字符 例输入字符串 include include includeusingnamespacestd intmain stringstr cout str cout 接收的字符串为 str 24 对于string型字符串的输入 不需要考虑存储空间的大小 因为string型字符串对象能动态申请存储空间并在必要时调整其大小空间 C风格字符串是一个字符数组 大小固定 没有动态扩充能力 如果从输入流中抽取的字符数多于字符数组的容量 则写入会超过数组界限 为防止发生这种情况 每次抽取C串时都必须设置通过setw设置抽取的最大字符宽度 例如 C格式字符串的输入为 charbuf sz cin setw sz buf 系统最多抽取sz 1个字符 最后一个存储空间存放串结束 0 25 5 其他输入函数除了提取符 外 也可以利用istream类的其他成员函数如 get getline read来实现数据的输入 1 get用来获取一个字符 例从键盘输入一串字符 判断其中字符 c 的个数 并输出 includeusingnamespacestd intmain charch intcount 0 charc c cout 输入 while ch cin get EOF if ch c count cout 输入的字符串中字符 c 出现了 count 次 26 2 getline函数用来获取一行getline函数原型为 istream 例利用getline从键盘输入字符串 includeusingnamespacestd intmain charch intcount 0 charc c cout 输入 chars 20 charb 10 cin getline s 20 最多读入19个字节或遇到 或遇到 n 读取结束cin getline b 10 最多读入9个字节或遇到 n 读取结束cout 输出 endl cout s endl cout b endl 27 3 read函数用来获取指定数量的字符read函数的原型为 istream用来读取指定数量的字符 此时 空格 回车 0 等都是可读入的字符 28 10 3 3用户自定义类型的I O 若要让自定义类提供支持 和 istream他们都返回对流对象的引用 29 例定义一个PhoneNumber类 用来描述电话号码 重载 和usingnamespacestd classPhoneNumber friendostream intmain PhoneNumberpn cin pn cout endl cout pn return0 30 10 4基于I O类库的文件I O 31 10 4 1文件的概念 在C 中 把文件看成是由一系列字节所构成的字节流 称为流式文件 根据文件中数据的组织形式 可分为文本形式文件和二进制形式文件 这两种文件格式的重要区别为 文本文件中通常包含的是可显的字符以及有限的几个控制字符 如 t n r 等 而二进制文件中可以包含任意的二进制字节 文本方式一般用于存储具有 行 结构的数据 如源程序以及纯文本格式的数据等 二进制文件一般用于存储无显式结构的数据 如目标代码程序以及二进制数据等 32 每个流对象内部都有一个指针称为文件位置指针 它指出该流对象所关联的文件的当前读写的位置 如图10 5所示 如果我们把一个文件看作一个未知长度的字节数组的话 则该位置指针就象是数组的下标 进行输入 输出操作时 每输入 输出一个字节 文件位置指针都会自动往后移动一个字节位置 即文件位置指针总是指向下个将要被读的字节位置 下一个将要被写的字节位置 在利用I O类库进行文件输入 输出时 需要包含下面指令 include include 33 10 4 2文件输出 文件输出是指将内容输出到文件中 基本流程为 1 打开文件 创建ofstream流类的对象 建立流对象与文件的关联 2 输出数据 利用ofstream的 以及其他的输出函数将数据写入到文件 3 关闭文件 利用ofstream成员函数close关闭流对象 1 打开文件打开文件有两种方法 直接方法和间接方法 直接方法是在创建流对象时指定关联的文件名和打开方式 如 ofstreamout file f1 txt ios out 间接方法是创建ofstream类对象后 调用ofstream的成员函数open来指定关联的外部文件以及打开方式 建立流和文件的关联 如 ofstreamout file out file open f1 txt ios binary ios binary表示打开该文件 并将以二进制流的形式进行输出 34 打开过程中 指定的ios out或ios binary都是设置了文件打开的方式 他们是定义在ios类中的枚举常量 有多中选择 如表所示 35 2 输出数据文件成功打开后 可以使用插入运算符 或ofstream类的一些成员函数来进行文件输出操作 其实 文件的输出和控制台的输出没有太多的区别 例从键盘输入数据 并输出到文件 include includeusingnamespacestd intmain ofstreamout file c myfile txt if out file return intx 100 doubley 3 14 out file x y endl out file WWW HHU EDU CN endl out file put out file put n out file write CIES HHU EDU CN 15 out file close 36 3 关闭文件文件输出操作结束时 要使用ofstream的一个成员函数close关闭文件 如 out file close 该操作将缓冲区中的数据全部送到文件中 然后切断out file流对象和文件的关联关系 并释放打开文件时系统分配的资源 以后就不能再利用out file来进行输出操作 除非再次使用out file open来将其和指定的文件关联 37 10 4 3文件输入 文件输入是指将文件中数据读取到内存文件中 基本流程为 1 打开文件 创建ifstream流类的对象 建立流对象与指定文件的关联 2 从文件读入 利用ifstream的 以及其他的输入函数读文件中数据 3 关闭文件 利用ifstream的成员函数close关闭流对象 取消流对象和文件的关联 38 1 打开文件创建ifstream类的对象 并与外部文件关联 建立ifstream对象与外部文件关联有两种方法 直接法和间接法 如 ifstreamin file f1 txt ios in 直接法 以文本形式打开文件f1 txt进行读或ifstreamin file in file open f1 txt ios in 间接法 以文本形式打开文件f1 txt进行读ios in用来控制文件打开的方式 在进行输入操作前也要判断文件是否正确打开 代码如下 if in file 或in file faile 或 in file is open 处理打开失败 39 2 从文件读数据文件成功打开后 可以使用抽取操作符 或ifstream类的一些成员函数进行输入操作 方法和基于控制台的输入基本相同 40 例读入上例输出的数据 并显示 include include includeusingnamespacestd intmain ifstreamin file c myfile txt if in file return1 intx doubley strings in file x in file ignore 忽略逗号 in file y in file s 将WWW HHU EDU CN输入到s中charln in file get 读到的是WWW HHU EDU CN后的回车符charc in file get 读到的是 in file ignore 忽略 后面的回车符 它是一个字节chararray 18 in file getline array 16 读取一行cout x y endl cout s cout ln cout c endl cout array in file close 41 3 关闭文件读入操作结束后 应使用close关闭文件 in file close 42 10 4 4文件随机存取 以上介绍的ostream和ifstream只能进行输出或输入操作 如果需要打开一个既能输入也能输出数据的文件 则需要创建一个fstream类的对象 下面打开的文件既能读出又能写入数据 fstreamio file c test txt ios in ios out 打开文件或fstreamio file io file open c test txt ios in ios out ios in和ios out用来控制文件打开的方式 具体的打开方式控制参数见表10 7的说明部分 以读写方式打开的文件 在流对象内部设置了两个文件位置指针 一个用于指定读的位置 一个用于指定写的位置 这两个位置指针是不同的 43 一般情况下读写是顺序进行的 即逐个字节进行 但是对于二进制数据文件来说 可以利用流中的成员函数移动文件位置指针 随机访问文件中任意位置上的数据 还可以修改文件内容 文件流所提供的和文件指针操作有关的成员函数如表所示 44 10 5基于I O类库的字符串I O C 提供了istringstream 输入 ostringstream 输出 和stringstream 输入 输出 来支持字符串输入 输出 要使用字符串I O功能 需要在程序中包含指令 include inc

温馨提示

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

评论

0/150

提交评论