地点:基地二楼
时间:2014.03.20
--------------------------------------------------------------------
一、格式化输入输出
除了条件状态每个iostream对象还维护着格式状态控制IO的格式化细节。比如:整型值得进制、浮点值得精度、输出元素的宽度等。
1.1 用操纵符改变格式状态
操纵符是一个函数或者对象,会影响流的状态,并能用作输入或输出运算符的运算对象。比如操纵符endl,我们可以将它“写”到输出流,就像它是一个值一样,但它不是一个普通的值,而是一个操作,用于输出一个换行符并刷新缓冲区。
操纵符分为控制数值输出形式和控制补白数量和位置两大类。大多数改变格式状态的操纵符都是由 设置/复原 成对出现,其中复原是复原为默认格式。当操纵符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。建议是最好在不需要特殊格式的时候尽快将流恢复到默认状态。
1.1.1控制布尔值的格式
操纵符改变对象的格式状态的典型是用boolalpha操纵符控制布尔值的显示格式,默认下bool值打印为1(true)或0(false),我们可以对流使用boolalpha操纵符来覆盖这种格式。而操纵符noboolalpha则可以帮助恢复默认格式。测试程序如下:
#include<iostream> using namespace std; int main(){ cout << "default bool values: " << true << " " << false << endl << boolalpha <<"aopha bool valuse: " <<true << " " << false <<endl <<"recover default bool values: " <<noboolalpha //通常情况下用完后恢复默认格式 <<true<<" "<<false <<endl; }
hex——十六进制输出
oct——八进制输出
dec——十进制
这些操纵符的用法和endl等一样。但要注意的是这三个只影响整型运算对象,对浮点值不受影响。
1.1.3在输出中指出进制
默认格式状态下,在打印数值时不会显示进制,这时可使用showbase操纵符,规范如下:
前导 0x 表示十六进
前导 0 表示八进制
无前导表示十进制
而noshowbase则恢复流状态,不再显示整型值得进制。提到十六进制,就涉及字母的大小写,默认格式状态是小写,我们可以使用操纵符uppercase使得字母大写,对应的nouppercase可使得字母恢复小写模式。于是类似:
cout<<nouppercase<<noshowbase<<dec<<endl;
常用来从大写表示的十六进制恢复到默认的十进制格式状态显示。
1.1.4控制浮点数格式
默认情况下,浮点值按六位数字精度打印,如果没小数部分则不打印小数部分包括小数点,根据浮点数的值选择打印成定点十进制或科学计数法形式,非常大或者非常小的值将打印成科学计数法,其他打印成定点十进制,以保证良好的可读性。
a.指定浮点数打印精度
精度能控制打印的数字总数,我们可以通过调用IO对象的precision成员或使用setprecision操纵符(定义在头文件iomanip中)来改变精度。precision成员函数是重载的,一个版本接受int值,能将精度设为该值,并返回旧精度值,还一个版本不接受参数,返回当前精度值,setprecision操纵符则接受一个参数用于设置精度。测试程序如下:
#include<iostream> #include<iomanip> using namespace std; int main(){ cout << "Default percision: " << cout.precision() << "Value: " << sqrt(2) << endl; cout << "Set 12 percision with precision function: " << cout.precision(12) << " Value: " << sqrt(2)<<endl; cout << "Set 3 percision with setprecision: " << setprecision(3) << "Value: " << sqrt(2) << endl; }好了,这个地方今天就学到吧,下次继续。。。。。。