13.1 简介

C++提供了广泛的输入输出功能

将讨论许多的IO操作都是面向对象的

运用了C++的的其他特性:引用,函数重载和运算符重载

C++使用类型安全的IO

任何一次IO操作都是对数据类型敏感的

用户可以通过重载流插入运算符来实现对用户自定义对象类型的IO操作

13.2 流

C++的IO是以一连串的字节流的方式进行的

输入操作中

字节从设备流向内存

输出操作中

字节从内存流向设备

应用程序通过字节传达信息

C++提供了低层次和高层次的IO功能

低层次的IO指定字节应从设备传输到内存还是从内存传输到设备

通常针对单个字节

提供速度快,容量大的传输

高层次的IO也即是格式化的IO

在这种输出方式中字节被组成了有意义的单元

例如整数,浮点数等数据类型

除了大容量的文件处理之外

基本可以满足需求

处理大容量文件 最好用非格式化的IO

使用非格式化的IO可能会导致可移植性的问题

非格式化的数据并不是在所有平台上都可移植‘

13.2.1 传统流与标准流

字符库包含了ASCILL字符集和Unicode字符集

C++的标准流库可以对Unicode字符进行IO

C++增加了wchar_t用来存储2字节的Unicode字符

还重新设计了传统的流类

仅处理char字符

利用类模板特化分别处理char和wchar_t字符类型

13.2.2 iostream库的头文件

C++的iostream库包含了几百种IO功能

iostream头文件中声明了几乎所有的IO流需要的基础服务

定义了cin,cout,cerr,clog对象

对应标准输入流

标准输出流

无缓冲的标准错误流

有缓冲的标准错误流

提供了非格式化和格式化的IO服务

iomanip头文件中声明了参数化流操纵符

用于向格式化的IO提供有用的服务

fstream头文件中声明了文件处理服务

13.2.3 输入输出流的类和对象

iostream提供了许多模板处理IO

模板basic_istream支持输入流

模板basic_ostream支持输出流

模板basic_iostream 同时支持输入输出

每个模板都有预先定义好的类模板处理char

还有一组typedef为模板提供别名

typedef说明符为预先定义的数据类型声明一个同义词

例如typedef Card *CardPtr;

定义了另一个类型名称作为Card*的同义字

注意:使用typedef创建一个名字但没有创建数据

只是增加了一个别名

iostream中的typedef的别名操作就是删除了这些模板前的basic_

IO流模板层次和运算符重载

模板basic_istream和basic_ostream派生自basic_ios

模板basic_iostream是从basic_istream和basic_ostream双重继承

左移运算符<<被重载用于实现流的输出称为流插入运算符

右移运算符>>被重载用于实现流的输入被称为流提取运算符

通常和cin,cout,cerr和clog以及用户自定义的流对象一起使用

标准流对象cin,cout,cerr和clog

cin是一个istream实例

被连接到标准输入设备(键盘)

例如cin>>grade;

编译器确定grade数据类型,选择适合的流提取运算符重载

cout是一个ostream实例

连接到标准输出设备(显示屏)

与cin操作类似

cerr是一个ostream实例

连接到标准错误设备

cerr的输出是无缓冲的

意味着每一个针对cerr的流插入的输出必须立即显示

clog是一个ostream实例

连接到标准错误设备

clog输出有缓冲

每个针对clog的流插入的输出将保持在缓冲区

等到缓冲区被填满或清空才输出

文件处理模板

C++使用

basic_ifstream

basic_ofstream

basic_fstream

用于文件输入输出

同样的typedef也提供了别名删去basic

它们实现的功能与cin,cout相似

只是连接到了文件上

13.3 输出流

ostream提供了格式化和非格式化的输出功能

输出功能包括使用流插入运算符执行标准数据的输出

通过成员函数put进行字符输出

通过成员函数write进行非格式化的输出

十进制,八进制,十六进制的整数输出

科学计数和定点小数格式输出

指定宽度输出

指定符号填充输出

使用科学计数和十六进制表示的大写字符输出

13.3.1 char*变量的输出

C++能自动判断数据类型

缺陷是

假设打印一个char*的值(字符串的第一个字符的地址)

然而<<运算符被重载用于打印char*数据类型作为以空字符结尾的字符串

解决方法:将char*强制转换为void*类型

地址是用16进制打印的

13.3.2 使用成员函数put进行字符输出

可以使用成员函数put输出字符

例如:cout.put(‘A’);

put可以级联使用

cout.put(‘A’).put(‘\n’);

因为点运算符 从左向右执行

put成员函数给ostream对象返回一个引用

该对象接收put调用

也可以用SCILL码的数值作为参数

cout.put(65);

13.4 输入流

输入的功能都是由istream提供

流提取运算符跳过输入流中的空白字符

流提取运算符给接收到的信息的流对象返回引用

如果引用被用作判断条件

将隐式调用流重载的void*强制转换

输入成功转化为非空指针

否则转换为空指针

根据指针的实际情况转化为true或false

13.4.1 get和getline成员函数

没有实参的get从指定流输入一个字符

包括空白字符及其他非图形字符

并将该值作为函数调用的返回值返回

使用成员函数eof,get和put

EOF是一个int类型的值

程序将字符读入int类型的变量character中

比表输入的每一个字符是否为EOF

cin.eof()的值初始为false 输出0

表示cin还未读到文件尾

put函数将字符输出到cout

输入EOF后

eof()变成true此时输出为1

表示cin已经读到了文件尾

get的三个版本

istream中的get没有实参并返回输入的字符

例如:

char b;

b=cin.get();

带一个字符引用参数的get函数将输入流中的下一个字符输入

存储在引用的字符参数内

char b;

cin.get(b);

带有三个参数的get:一个字符数组,一个长度限制,一个分隔符(默认为‘\n’)

这个函数可以从输入流读取多个字符

读取数组最大长度-1个字符终止

或是遇到分隔符就终止

程序中,插入一个空字符用来结束字符数组中的输入字符组

分隔字符只是保留在输入流中(下一个被读取的字符)

第二次get调用的结果将是空行

可以用cin.ignore()移除分隔符

char buffer1[20];

cin.get(buffer1,20);

使用成员函数getline

getline和第三个版本的get类似

在字符串末尾插上一个空字符

getline会从流中移除分隔符

也就是读取字符然后丢弃

13.4.2 istream的成员函数peek,putback,ignore

istream中的ignore

两种功能:

读取并丢弃一定数量的字符(默认为1个字符)

遇到指定分隔符时停止(默认为EOF)

putback 将先前使用get函数从输入流里获取的字符放回到流里

peek将返回输入流中的下一个字符,但不去除

13.4.3 类型安全的IO

重载流运算符可接受各种指定类型的数据项

遇到意料之外的数据类型

各种错误会被设置

13.5 使用read,write和gcount的非格式化的I/O

非格式化的输入输出使用的分别是

istream和ostream中的成员函数read和write

read将一定数量的字节读入到字符数组中

write从字符数组中输出字节

这些字节没有经过任何格式化

就像原始字节一样输入输出

write函数会自动跳过’\0’字符

继续输出后面的字符直到停止

而cout遇到’\0’字符就会终止

read将指定数量的字符读入到字符数组中

读取的字符数量少于指定数量时

failbit将被设置

成员函数gcount返回最近一次输入操作所读取的字符数

13.6 流操纵符简介

C++提供多种流操纵符完成格式化任务

包括:

设置域宽

设置和取消格式状态

设置域的填充字符

刷新流

向输出流添加新行

输出流中添加一个空字符

跳过输入流中的空白

13.6.1 整型流的基数:dec,oct,hex和setbase

为了能够更改流中整型的基数

可以插入dec,oct之类的操纵符将基数设置为各种进制

可以通过setbase流操纵符改变流的基数

可以通过整数参数将基数设置为其他进制

由于setbase有参数,被称为参数化流操纵符

必须包含iomanip头文件

setbase是粘性的

13.6.2 浮点精度(precision,setprecision)

可以使用setprecision或ios_base的成员函数precision控制浮点数的精度

控制小数点右边的位数

调用两者中任何一个都可以改变输出精度

影响后面所有的输出操作

直到下一个设置精度被调用为止

调用无参数的precision将返回当前的精度设置

可以重新使用原来的精度设置

setprecision与cout搭配使用

用流运算符

precision直接调用传参

两者都是粘性的

13.6.3 域宽(width,setw)

成员函数width可以设置域宽(基类是ios_base)

返回原先的域宽

如果输出值宽度小于域宽

插入填充字符进行填充

输出值宽度大于域宽

会将整个值打印出来

不含参数的width返回当前域宽

含参数的width将设置当前域宽

宽度设置不是粘性的

默认为0

在向一个char数组输入数据时

读入的最大空字符数将小于指定宽度

因为必须在输入的字符串中插入空字符

遇到第一个不在开头的空白字符

流提取结束

13.6.4 用户自定义输出流操纵符

程序员可以创建自己的流操纵符

对于输出流来说

它们的返回类型参数都必须是ostream&型

13.7 流的格式状态和流操纵符

skipws 跳过输入流的空白字符

left right 域的输出的左右对齐

internal 表示域的数字符号左对齐 数值部分右对齐 中间填充

boolalpha 指定bool类型的值按照true和false输出

dec 十进制输出

oct 八进制输出

hex 十六进制输出

showbase 指明数字的基数(十进制无特殊,八进制前加0,十六进制前加0x)

showpoint 指明浮点数必须显示小数点

uppercase 指明十六进制时用大写字母 科学计数法的e也是大写

showpos 在数值前加上正负号

scientific 以科学计数法输出浮点数

fixed 定点小数输出浮点数 指定小数点右边的位数

13.7.1 尾数零和小数点(showpoint)

showpoint强制浮点数输出必须带小数点和尾数零

浮点数的默认精度为6

不使用fixed和scientific时 精确度表示显示的有效位数(总位数)

13.7.2 对齐(left,right和internal)

left和right使域左右对齐 并填充字符

13.7.3 内容填充(fill,setfill)

成员函数fill和参数化流操纵符设置填充字符

13.7.4 整型流的基数(dec,oct,hex和showbase)

提供dec,hex和oct分别制定十进制,十六进制,八进制显示

默认为十进制

showbase会在数据前方显示数据的基数

如果是十进制,不加任何东西

如果是八进制,加0

如果是十六机制,加0x

noshowbase可以取消showbase

13.7.5 浮点数,科学计数法和定点小数计数法(scientific,fixed)

粘性scientific和fixed控制浮点数的输出格式

使用defaultfloat可以恢复不用科学计数法

13.7.6 大写控制

uppercase控制十六进制和科学计数法输出的字母的大写

使用nouppercase可以取消

13.7.7 指定布尔格式(boolalpha)

使得bool型的数据在输出的时候是true和false

可以只用noboolalpha来取消

13.7.8 通过成员函数flags设置和重置格式状态

ios_base类中的fmtflags数据类型可以保存当前格式状态

成员函数flags 无参数的时候是返回当前的格式状态

有参数的时候将当前的状态设置为参数中的状态

13.8 流的错误状态

在遇到文件尾 输入流的eofbit被设置

成员函数eof可以判断是否遇到文件尾

cin.eof()遇到文件尾返回true

13.9 将输出流连接到输入流

C++提供成员函数tie来使istream和ostream同步操作

cin.tie(&cout);

将cout和cin连接起来

接触绑定:

inputStream.tie(0);

13.10本章小结

介绍了用流来进行输入输出

学习IO流的类和对象

StreamInPut/Output相关推荐

  1. Ubuntu 16.04 安装后修改屏幕分辨率(xrandr: Failed to get size of gamma for output default)

    ubuntu 16.04 安装后分辨率只有一个选项 1024x768,使用 xrandr 命令出现错误: xrandr: Failed to get size of gamma for output ...

  2. Angular No name was provided for external module 'XXX' in output.globals 错误

    Angular 7 开发自定义库时,引用ngZorroAntd,build过程中出现 No name was provided for external module 'ng-zorro-antd' ...

  3. Angular使用@Input和@Output实现父子组件互相传参(类似Vue的props和this.emit)

    app.component.html <app-in-out [in]='"传输进入"' (out)="out($event)" ></app ...

  4. 关于OSD::mkfs: ObjectStore::mkfs failed with error (5) Input/output error问题的解决

    环境: ceph L版本12.2.1升级到12.2.12 这个问题是由于升级后进行12.2.12环境中的使用ceph-disk 进行osd部署时出现如下问题,执行命令 ceph-disk -v pre ...

  5. Java孩子父母类,@Output孩子和父母之间的沟通 . 角2(5)

    我正在尝试学习角度2,并且我正在尝试使用来自我的子组件的数据在父组件中设置变量 . 基本上我在父视图中有一个子 Headers ,我希望 Headers 和一些HTML根据加载的子项进行更改 . 父组 ...

  6. This is probably not a problem with npm. There is likely additional logging output above

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. E:\weii_objct\invoice-manage-web-view>npm start > ...

  7. SQL Server 储存过程的output 参数

    要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...

  8. ACMNO.10打印出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 Output: 153 ???

    题目描述 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为153=1^3+5^3+3^3. ...

  9. Loadrunner连接负载机失败,提示Failed to connect to the load generator.Check the output window for more detail

    在测试连接负载机时,为何连接不上呢,提示"Failed to connect to the load generator.Check the output window for more d ...

最新文章

  1. 考前自学系列·计算机组成原理·补码定点加减运算和溢出判断,浮点数的加减运算,原码的乘法
  2. python爬虫,记录一下爬取过程,列表数据,翻页,post方式,保存字典
  3. ad域 禁用账号_通过AD域控平台统一批量管理公司电脑的桌面
  4. 09-CoreData iOS10.0变化
  5. MySQL中的时间函数用法集合
  6. SQL注入(SQL注入(SQLi)攻击)攻击-联合注入
  7. 0913作业(冒泡排序、二分查找法、模拟摇乐游戏)
  8. FB宣布将回购60亿美元股票 首席会计官将离职
  9. 中国2008经济数据
  10. mysql数据库汉字乱码解决方案
  11. Could not find or load main class org.apache.hadoop.hdfs.server.namenode.NameNode
  12. Java基础,不需要使用复杂语句,实现出计算机功能,Java计算机,Java计算器
  13. mysql表关联查询都有什么方式_Mysql数据库多表联合查询有几种方法?
  14. javascript表单提交的内容显示在表格中
  15. 图文并茂简介如何查询文章是否被SCI收录以及获取SCI索引号
  16. 自定义 kubectl-plugin
  17. 【表格合并与底纹】vue-elementul表格简单实现合并单元格,与列和行给底纹颜色
  18. Linux系统下计算机C语言的编程技巧
  19. 大连先河计算机学校什么时候黄的,黑带联盟_235
  20. 谷粒学院(五)---Maven从入门到入魔

热门文章

  1. Ant工具 ant的安装与配置 ant作用
  2. 教会你ECshop安装百度分享按钮教程
  3. 将任意自然数分解为质数的乘积(Java实现)
  4. 深度学习之五:稀疏编码
  5. 网页采集工具-免费网页采集工具大全
  6. HashMap 的底层原理
  7. mybatis错误:Could not resolve resource location pattern [classpath:com/demon/user/mapper/*.xml]: class
  8. Tekton实战案例--S2I
  9. 厂长来了 | 从个人英雄到软件工程,我们经历了什么
  10. lte tm模式_空中接口学园--LTE 传输模式TM10 有什么功能?[求助]