type
status
date
slug
summary
tags
category
icon
password
Property
iostream
对象还维护一个格式状态来控制IO如何格式化,如整型值是几进制、浮点数的精度、一个输出元素的宽度等。标准库定义了一组操纵符修改流的格式状态,一个操纵符是一个函数或对象,会影响流的状态,并能用作有输入或输出运算符的运算对象,并且操纵符和输入输出运算符一样返回它所处理的流对象,因此可以在一条语句中组合数据和操纵符。endl
是一个操纵符,将它“写入”输出流,就像它是一个值一样,但它不是值,而是一个操作,它输出换行符并刷新缓冲区。大多改变格式状态的操纵符都是设置/复原成对的。操纵符改变状态后,对后续所有IO都生效。
打印布尔值时,会打印出1和0,可以用
boolalpha
操纵符打印出true
和false
:IO
整型值时使用十进制,可以用hex
、oct
和dec
改变它:在输出中不知道打印的是几进制,可以使用
showbase
操纵符输出进制信息:默认,十六进制以0和小写x开头,也可以以0大写X开头,这样做的话,也会输出大写A~F:
默认,浮点数以六位有效数字打印,但位数不够六位时后边不会补0,如3.14后面不会补3个0,而是直接输出3.14;如浮点值没有小数部分,则不打印小数点和小数部分;根据浮点数的值会自动选择打印成十进制或科学计数法(非常大或非常小时,为了可读性)形式。
默认,浮点值超出六位有效数字的部分会四舍五入而非截断,四舍五入后最后的0不会输出,如3.333398会输出3.3334,最后的0不会输出。
precision
和setprecision
操纵符会改变浮点数精度。precision
是重载的,一个版本接受int
值,将精度设为此值,另一个版本不接受参数,返回当前精度值;setprecision
操纵符接受一个参数,用来设置精度。setprecisin
和其他接受参数的操纵符定义在头文件iomanip
中:sqrt
函数定义在头文件cmath
中,它是重载的,分别接受float
、double
、long double
值,返回实参的平方根。ends
输出的空字符看起来像空格。执行
scientific
、fixed
、hexfloat
后,精度值控制的是小数点后面的数字位数,而默认情况下指定的是有效数字的位数。以上输出中setw为12,正负号和点也占位。
输入运算符会忽略空白符(空格符、制表符、换行符、换纸符、回车符),获取空白符:
格式化IO:根据读取或写入的数据类型来格式化它们。
标准库还提供了未格式化IO,它允许我们将一个流当作一个无解释的字符序列来处理。
每次一个字节地处理流:
将获取到的字符重新放回流中:
peek
方法返回输入流中下一个字符的副本,但不会将它从流中删除
unget
方法使得输入流向后移动,从而使最后读取的值又回到流中
putback
方法与unget
功能相同,它退回流中读取的最后一个值,但它接受一个参数,此参数必须与最后读取的值相同
一般,标准库最多保证我们可以回退一个值。以下代码会无限输出第一个输入字符:
peek
方法和无参的get
方法以int
类型从输入流返回一个字符,这是因为如果以char
返回的话,每一个char
值都代表一个真实的字符,这样就没有字符能表示文件尾。返回时,会将char
先转换为unsigned char
,然后再将结果提升为int
,这样负值表示的char
也会被映射为正值,之后就可以用负值表示文件尾了。头文件cstdio
定义了一个名为EOF的const值,可以用它检测get
的返回值是否是文件尾,而不必记忆表示文件尾的实际数值:get
方法遇到分隔符后停止读取,但分隔符还在流中
getline
方法同样遇到分隔符后停止读取,但分隔符会读取并丢弃
调用了
peek
、unget
、putback
等将单个字符放回流中的方法后,再调用gcount
返回0。iostream
类型通常不支持随机访问,以下随机访问内容针对fstream
和sstream
。因为随机IO本质上是依赖于系统的,随机访问是否会成功取决于流绑定到哪个设备。g结尾的用于输入流get,p结尾的用于输出流put。
对于读写都可以的流,它们只有单一的标记表示缓冲区中的当前位置,标准库将p和g版本的读写位置都映射到这个单一的标记,因此,只要我们在读写操作间切换,就必须进行seek操作来重定位标记。
seek
的绝对地址类型为pos_type
,相对地址类型为off_type
,它们是机器相关的,定义在头文件istream
和ostream
中。tell
函数可以返回一个pos_type
的绝对地址值,以便之后再回来。在文件尾部添加以空格分隔的每一行末尾的累计长度(包括换行符):