学科分类
目录
C++基础

精度、域宽、填充字符的设置

上一节我们学习了流的状态标志位,以及如何设置这些状态,接下来本节课学习一下浮点数的精度设置、域宽设置以及填充字符的设置。

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()函数直接插入到了输出流中。

点击此处
隐藏目录