时间:2014.03.22
地点:基地
---------------------------------------------------------------------
一、指定浮点数计数法
最佳实践:除非你需要控制浮点数的表示形式,比如按列打印数据或打印表示金额或百分比的数据),否则由标准库选择计数法是最好的方式。
同样的道理,通过使用操纵符可以控制流使用科学计数法、定点十进制或十六进制计数。这些操纵符总结如下:
scientific 改变流的状态使用科学计数法
fixed 改变流的状态使用定点十进制
hexfloat 强制浮点数使用十六进制格式
defaultfloat 将流恢复到默认状态(根据要打印的值选择计数法)
---------------------------------------------------------------------
二、打印小数点
默认情况当浮点值得小数部分为0时不显示小数点,showpoint操纵符强制打印小数点;noshowpoint则恢复默认行为。比如:
cout<<showpoint<<10.0
<<noshowpoint<<endl;
---------------------------------------------------------------------
三、输出补白
setw 指定下一个数字或字符串值得最小空间,例:setw(12) 将在输出中至少流出12个位置供下一个输出占据
left 左对齐输出
right 右对齐输出,默认格式
interal 控制负数的符号的位置,左边符号对齐,右对值对齐,用空格填满所有中间空间
setfii 允许指定一个字符代替默认的空格来补白输出。例:setfill('#')
下面在来总结下定义在头文件iomanip中的操纵符,有:
setfill(ch) 用字符ch填充空白
setprecision(n) 将浮点精度设置为n
setw(w) 读或者写值得宽度为w个字符
setbase(b) 将整数输出为b进制
---------------------------------------------------------------------
四、控制输入格式
默认情况下,输入运算符会忽略空白符(空格符、制表符、换行符、回车符)而操纵符noskipws则会令输入运算符读取空白符而不是跳过,恢复默认行为则再使用skipws操纵符,比如:
char ch;
while(cin>>ch){
cout<<ch;
输入:
a b d
d
循环执行 4次
cin>>noshipws; //现在设置cin读取空白符
while(cin>>ch)
cout<<ch;
cin>>skipws; //将cin恢复到默认状态,丢弃空白符
和前一样用相同的输入时,循环会执行7次(4个普通字符,一个空格字符,一个制表符,一个回车符)
---------------------------------------------------------------------
五、未格式化的输入/输出操作
未格式化IO操作运允许我们将一个流当做一个无解释的字节序列来处理。比如我们可以使用未格式化IO操作get和put来读取和写入一个字符:
char ch;
while(cin.get(ch))
cout.put(ch);
这种未格式化的IO操作执行于底层操作之上,不会忽略任何字符。单字节底层IO操作总结如下:
is.get(ch) 从istream is流中读取下一个字节存入字符ch中,返回is流
os.put(ch) 将字符ch输出到ostream os,返回os流
is.get() 将is流的下一个字节作为int返回
is.putback(ch) 将字符ch放回is流中,返回is
is.unget() 将is向后移动一个字节,返回is流
is.peek() 将下一个字节作为int返回,但不从流中删除它
---------------------------------------------------------------------
六、将字符放回输入流
有三种方法:
1.peek方法返回输入流中下一个字符的副本,但不会将它从流中删除,peek返回的值仍然在流中
2.unget使得输入流向后移动一个字节
3.putback退回从流中读取的最后一个值,接受一个参数,但此参数必须与最后读取的值相同
---------------------------------------------------------------------
七、从输入操作返回的int值
函数peek和无参的get都以int类型从输入流返回一个字符。但为何不用char显得更自然呢,原因是:返回int可以返回文件尾标记,char范围中的每个值表示一个真实字符,因此范围中没有额外的值可用来表示文件尾。返回int的函数先将返回的字符转换为unsigned char,然后在将结果提升到int。因此即使字符集中友字符映射到负值,这些操作返回的int也是正值。而标准库使用负值表示文件尾,这样就可以保证与任何合法字符的值都不同。头文件cstdio定义了一个名为EOF的const,可用来检测从get返回的值是否是文件尾,而不必记忆表示文件尾的实际数值。
int ch; //使用一个int而不是一个char来保存get()的返回值
while( (ch=cin.get() )!=EOF)
cout.put(ch);
---------------------------------------------------------------------
八、多字节操作
如果速度是考虑的重点,那么使用未格式化IO操作一次处理大块数据是很有必要的。总结如下:
is.get(sink,size,delim)
从is流中最多读取size个字节,并保存在字符数组中,字符数组的起始地址由sink给出,读取过程直至遇到字符delim或读取了size个字节或遇到文件尾时停止。如果遇到的是delim,则将其留在输入流中,不读取出来存入sink中。
is.getline(sink,size,delim); //和上述get类似
is.read(sink,size); //读取最多size个字节,存入字符数组sink中,返回is流
is.gcount(); //返回上一个未格式化读取操作从is读取的字节数
os.write(source,size); //将字符数组source中的size个字节写入os,返回os
is.ignore(size,delim); //读取并忽略最多size个字符,包括delim,与其他未格式化函数不同,ignore有默认参数,size默认值为1,delim的默认值为文件尾。
get和getline有类似的行为,差别在于get将分隔符留作istream中的下一个字符,而getline则读取并丢弃分隔符。无论哪个函数都不会将分隔符保存在sink中。
---------------------------------------------------------------------
---------------------------------------------------------------------
九、确定读取了多少个字符
某些操作从输入读取未知个数的字节,可以调用gcount来确定最后一个未格式化输入操作读取了多少个字符。将字符退回流的单字符操作也属于未格式化输入操作。如果在调用gcout之前调用了peek、unget或putback,则gcount的返回值为0 。