C++ 中的 cout.setf() 函数

Posted 白水baishui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中的 cout.setf() 函数相关的知识,希望对你有一定的参考价值。

代码cout.setf(ios_base::fixed, ios_base::floatfield)怎么解释?

C++中通过cout来实现格式输出,就类似于C语言中通过printf()来实现格式输出。cout.setf()的作用是通过设置格式标志来控制输出形式,其中ios_base::fixed表示:用正常的记数方法显示浮点数(与科学计数法相对应);ios_base::floatfield表示小数点后保留6位小数。

该问题中调用的是setf()函数的第二个原型,setf()函数有两个原型,分别是:

fmtflags setf(fmtflage) //第一原型
fmtflags setf(fmtflags, fmtflags)  //第二原型
//fmtflags 是 bitmask 类型(一种用来存储各个位值的类型)的 typedef 名
//显而易见,两个原型的主要区别在于参数数量不同

下面详细介绍 setf() 的两个原型的使用:

setf()的第一原型:
C++为标准输入和输出定义了一些格式标志, 它可以通过flags(), setf(), 和 unsetf() 三个函数来控制.
例如:

cout.setf(ios_base::left); //对所有cout的输出进行左对齐调整.

还有一些常见的标志:

标志功能
boolalpha可以使用单词"true"和"false"进行输入/输出的布尔值.
oct用八进制格式显示数值.
dec用十进制格式显示数值.
hex用十六进制格式显示数值.
left输出调整为左对齐.
right输出调整为右对齐.
scientific用科学记数法显示浮点数.
fixed用正常的记数方法显示浮点数(与科学计数法相对应).
showbase输出时显示所有数值的基数.
showpoint显示小数点和额外的零,即使不需要.
showpos在非负数值前面显示"+(正号)".
skipws当从一个流进行读取时,跳过空白字符(spaces, tabs, newlines).
unitbuf在每次插入以后,清空缓冲区.
internal将填充字符回到符号和数值之间.
uppercase以大写的形式显示科学记数法中的"e"和十六进制格式的"x".

举例演示:

// 形式一:
// cout << showpos << 255 << endl;

// 形式二:
// showpos(cout);
// cout << 255 << endl;

// 形式三:
cout.setf(ios_base::showpos);
cout << 255 << endl;
//输出: +255
// 形式一:
// cout << scientific << 255.255 << endl;

// 形式二:
// scientific(cout);
// cout << 255.255 << endl;

// 形式三:
cout.setf(ios_base::scientific);
cout << 255.255 << endl;
//输出: 2.55255e+02

也可以通过使用下面的操作符,不直接操作标志。
例如:当我们设置dec标志时, 我们可以使用下面的命令:

cout << dec; //设置dec表示

设置endl标志时,可以使用下面命令:

cout << endl; //输出换行标示,并清空缓冲区

iostream中定义的操作符

操作符描述输入输出
boolalpha启用boolalpha标志
dec启用dec标志
endl输出换行标示,并清空缓冲区
ends输出空字符
fixed启用fixed标志
flush清空流
hex启用 hex 标志
internal启用 internal 标志
left启用 left 标志
noboolalpha关闭boolalpha 标志
noshowbase关闭showbase 标志
noshowpoint关闭showpoint 标志
noshowpos关闭showpos 标志
noskipws关闭skipws 标志
nounitbuf关闭unitbuf 标志
nouppercase关闭uppercase 标志
oct启用 oct 标志
right启用 right 标志
scientific启用 scientific 标志
showbase启用 showbase 标志
showpoint启用 showpoint 标志
showpos启用 showpos 标志
skipws启用 skipws 标志
unitbuf启用 unitbuf 标志
uppercase启用 uppercase 标志
ws跳过所有前导空白字符

iomanip中定义的操作符

操作符描述输入输出
resetiosflags(long f)关闭被指定为f的标志
setbase(int base)设置数值的基本数为base
setfill(int ch)设置填充字符为ch
setiosflags(long f)启用指定为f的标志
setprecision(int p)设置数值的精度(四舍五入)
setw(int w)设置域宽度为w

举例演示:

cout << setiosflags(ios_base::scientific) << 255.255 << endl;
//输出: 2.55255e+02
cout << setiosflags(ios_base::scientific); //启用scientific标志
cout << resetiosflags(ios_base::scientific); //关闭scientific标志
cout << setprecision(4) << 255.255 << endl; //设置输出数值的精度为4位
//输出: 255.3

setf()的第二原型:
第二原型包含两个参数,第一个参数和第一原型里的参数一样,第二个参数指出要清除第一参数中的哪些位,也就是说,在第二原型中,第一个参数指出要设置哪些位,第二个参数指出要清除哪些位。

虽然听起来很麻烦,但实际上用起来却很简单,只需按自己的实际需求在下表中找到对应的参数套上去就可以了。

setf(long, long) 的参数

第二个参数第一个参数含义
ios_base::basefieldios_base::dec使用10进制
ios_base::oct使用8进制
ios_base::hex使用16进制
ios_base::floatfieldios_base::fixed使用定点计数法(即一般计数法)
ios_base::scientific使用科学计数法
ios_base::adjustfieldios_base::left左对齐
ios_base::right右对齐
ios_base::internal符合或前缀左对齐,值右对齐

以上是关于C++ 中的 cout.setf() 函数的主要内容,如果未能解决你的问题,请参考以下文章

C++中怎么输出一个很大的数?深圳

c++中怎么控制左右对齐

cout.setf(ios::hex) 没效果问题的解决

cout.setf(ios::hex) 没效果问题的解决

c++:cout

C++助教篇5_Week3不完全知识点总结