cout的格式控制——关于cout.width()和cout.fill()

时间:2023-02-09 18:18:21

今天做C++的高精度的时候发现高精度的模板输出使用到了cout.width()和cout.fill()以便把每个单元存放的四位数字输出

于是就去查找了一下关于cout.width()和cout.fill()的相关信息

关于cout.width():


a、控制符int width()将用来调整字段的宽度,因为width是成员函数,所以要通过对象来调用,比如cout.width()将显示当前的字段宽度,默认为0,而cout.width(3)将把字段宽度设定为3。
注意C++容纳字段的方式为给字段分配刚好合适的宽度来容纳字段,所以C++中默认的字段宽度为0,以适合于所有的字段。
b、width的默认对齐方式为右对齐,即如果cout.width(12)如果字段没有这么宽,则将在字段的左边填以空格来达到12个字段的宽度。
c、还要注意的是width只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值,比如cout.width(12); cout<<2<<3;则输出2时会以12字段的宽度显示,但显示3时就会以默认的方式显示了。
d、int width()调用他时将会反回上一次的字段宽度的值。

关于cout.fill():

成员函数fill()可以用来改变填充的字符,比如cout.fill(‘*'),使用*填充空白部分。

但是千万要注意:fill函数在设置后将一直有效,除非被重新设定。这一点与width()十分不同。width只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值0.

而且cout.fill('*')会返回设置'*'之前的fill字符' '   所以如果用cout<<cout.fill('*')就会输出这个空格

所以下面这个程序的输出结果是: 

123456789
******* 123    //(注意星号和数字之间还有一个空格)

#include <iostream>
using namespace std;

void main()
{
cout<<"123456789"<<endl;
cout.width(8);
cout<<cout.fill('*')<<123<<endl;
}


 

C++中还有一个setw()与cout.width()的功能类似

这两个函数的作用是一样的。都是控制输出字符域宽度的,且不足用空格填充。在C++中,setw(int n)用来控制输出间隔。
例如:    cout<<'s'<<setw(8)<<'a'<<endl;
则在屏幕显示
s       a
s与a之间有7个空格,setw()只对其后面紧跟的输出产生作用,如上例中,表示'a'共占8个位置,不足的用空格填充。

若输入的内容超过setw()设置的长度,则按实际长度输出。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。

比如cout.fill('*');  之后   cout<<’s'<<setw(8)<<'a'<<endl;就输出  s*******a,s与a之间有7个星号

使用setw(n)设置输出宽度时,默认为右对齐。若想让它左对齐的话,只需要插入 std::left,同理,右对齐只要插入 std::right,不过右对齐是默认状态,不必显式声明。

在c++中 以下函数可互用:
setw 或 width()
setfill 或 fill()
setprecision 或 precision()
其中前面的set* 需要头文件 #include<iomanip>

 

 

还有一些其他的格式控制,这里只是提一下:

ios::dec  以10进制表示整数
ios::hex  以16进制表示整数
ios::oct  以8进制表示整数  
setfill(*) 设填充字符为*  
setprecision(n) 设显示小数精度为n位   
setw(n) 设域宽为n个字符   
setiosflags(ios::fixed) 固定的浮点显示   
setiosflags(ios::scientific) 指数表示   
setiosflags(ios::left) 左对齐   
setiosflags(ios::right) 右对齐   
setiosflags(ios::skipws) 忽略前导空白   
setiosflags(ios::uppercase)16进制数大写输出   
setiosflags(ios::lowercase)16进制数小写输出

ios::dec  以10进制表示整数
ios::hex  以16进制表示整数
ios::oct  以8进制表示整数
ios::showbase  为整数添加一个表示其进制的前缀
ios::internal  在符号位和数值的中间插入需要数量的填充字符以使串两端对齐
ios::left  在串的末尾插入填充字符以使串居左对齐
ios::right  在串的前面插入填充字符以使串居右对齐
ios::boolalpha  将bool类型的值以true或flase表示,而不是1或0
ios::fixed  将符点数按照普通定点格式处理(非科学计数法)
ios::scientific  将符点数按照科学计数法处理(带指数域)
ios::showpoint  在浮点数表示的小数中强制插入小数点(默认情况是浮点数表示的整数不显示小数点)
ios::showpos  强制在正数前添加+号
ios::skipws  忽略前导的空格(主要用于输入流,如cin)
ios::unitbuf  在插入(每次输出)操作后清空缓存
ios::uppercase  强制大写字母