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