精度、域宽、填充字符的设置
上一节我们学习了流的状态标志位,以及如何设置这些状态,接下来本节课学习一下浮点数的精度设置、域宽设置以及填充字符的设置。
1、浮点数精度设置
在C++中可以人为的控制浮点数的精度,ios类重载了两个设置精度的成员函数,如下所示:
int ios::precision();
int ios::precision(int n);
● 第一种形式用于返回当前的输出精度。
● 第二种形式设置输出精度为n位,并返回设置前的精度。
设置了精度以后,该精度对之后所有的输出操作都有效,直到下一次的精度设置为止。精度最小值为1,如果精度设置为0,则系统会按默认的精度显示数据。
2、域宽设置
域宽是输入输出时所占用的字符数,ios类重载了两个设置域宽的成员函数,如下所示:
int ios::width() const;
int ios::width(int n);
● 第一种形式用于返回当前的域宽值,未设置时,域宽的取值为0。
● 第二种形式用于设置域宽为n位,并返回设置前的域宽值,设置的域宽在下一次格式化输出时有效,而且只对其后的第一个输出有影响,输出完成后,域宽又立即置为0。
如果显示数据所需要的宽度比设置的域宽小,空位用填充字符来填充,如果显示数据所需要的宽度比设置的域宽大,数据并不会被截断,系统会输出所有位。
除了上述两个函数外,函数setw()也可以设置域宽,其声明如下所示:
setw(int n);
该函数可以将设置宽度命令插入到输入/输出流中,比单独调用格式化函数更加方便,并且,当需要显示的数据比设置的字段宽度大时,将显示整个数据值。
注意:setw(int n)不是ios类的成员函数,它属于操控符,包含在iomanip头文件中,若要使用需要引入该头文件。
3、填充字符设置
填充字符的作用是当输出数据小于域宽时用填充字符来填充,系统默认情况下填充字符为空格,也可设置用户希望的填充字符,ios类重载了两个设置填充字符的成员函数,如下所示:
char ios::fill() const;
char ios::fill(char ch);
● 第一种形式用于返回当前填充字符的值。
● 第二种形式用于设置填充字符为ch。
除此之外,函数setfill()也可以设置填充字符,功能类似于fill()函数,其声明如下所示:
setfill(char c) const;
该函数可以直接插入流中,与setw()函数一样,setfill()包含在iomanip头文件中,并不是ios类的成员函数。
学习完了这几种格式化设置函数后,我们用一个案例来演示其用法,具体代码如例1所示。
例1
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4 int main()
5 {
6 double d = sqrt(2.0);
7 cout << "精度设置:" << endl;
8 for (int i = 0; i < 5; i++)
9 {
10 cout.precision(i); //设置不同的精度
11 cout << d << endl;
12 }
13 cout << "当前精度为:" << cout.precision() << endl;
14
15 cout << "当前域宽:" << cout.width() << endl;
16 cout.width(6); //默认是右对齐
17 cout << d << endl;
18
19 cout << "当前填充字符:" <<cout.fill()<<"|"<< endl;
20 cout.width(10); //设置域宽,精度设置一次就不必重新设置
21 cout << setfill('*')<<d << endl; //setfill()函数可以直接插入流中
22 system("pause");
23 return 0;
24 }
运行结果如图1所示。
图1 例1运行结果
在例1中,定义了一个实型变量d,是对2.0开方,代码8-12行用for循环设置不同的精度来输出d的值,当精度为0时,系统按默认的精度输出,当精度为4时循环结束;代码13行调用precision()函数获取循环结束后的精度为4。代码15-17行分别是获取和设置域宽,当数据小于域宽时,由图1可知,系统用空格作为填充字符,1.414前面空了一个空格。代码第19-21行分别是获取和设置填充字符,设置填充字符时,调用setfill()函数直接插入到了输出流中。