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::basefield | ios_base::dec | 使用10进制 |
ios_base::oct | 使用8进制 | |
ios_base::hex | 使用16进制 | |
ios_base::floatfield | ios_base::fixed | 使用定点计数法(即一般计数法) |
ios_base::scientific | 使用科学计数法 | |
ios_base::adjustfield | ios_base::left | 左对齐 |
ios_base::right | 右对齐 | |
ios_base::internal | 符合或前缀左对齐,值右对齐 |
以上是关于C++ 中的 cout.setf() 函数的主要内容,如果未能解决你的问题,请参考以下文章