基本技能11.5:使用控制器来进行格式化输入和输出
C++的输入和输出系统提供了第二种可用于修改流格式参数的方法。这种方法使用到了特殊的函数,叫做控制器。这种控制器可用于输入/输出表达式中。表格11-1列出了标准的控制器。在使用需要参数的控制器的时候我们必须在程序中包括<iomanip>。
控制器 | 引入的目的 | 输入/输出 |
boolalpha | 打开boolalpha标记开关 | 输入/输出 |
dec | 打开dec标记开关 | 输入/输出 |
endl | 输出一个换行字符并强制流输出数据 | 输出 |
ends | 输出一个空字符('/0') | 输出 |
fixed | 打开fixed标记开关 | 输出 |
flush | 强制输出流中的所有数据 | 输出 |
hex | 打开hex标记开关 | 输入/输出 |
internal | 打开internal标记开关 | 输出 |
left | 打开left标记开关 | 输出 |
noboolalpha | 关闭boolalpha标记开关 | 输入/输出 |
noshowbase | 关闭showbase标记开关 | 输出 |
noshowpoint | 关闭showpoint标记开关 | 输出 |
noshowpos | 关闭showpos标记开关 | 输出 |
noskipws | 关闭skipsw标记开关 | 输入 |
nounitbuf | 关闭unitbuf标记开关 | 输出 |
nouppercase | 关闭uppercase标记开关 | 输出 |
oct | 打开oct标记 | 输入/输出 |
resetosflags(fmtflags f) | 关闭f参数中指定的标记 | 输入/输出 |
right | 打开right标记 | 输出 |
scientific | 打开scientific标记 | 输出 |
setbase(int base) | 设置整数的基数 | 输入/输出 |
setfill(int ch) | 设置填充字符 | 输出 |
setiosflags(fmtflags f) | 打开f参数中指定的标记开关 | 输入/输出 |
setprescision(int p) | 设置小数的精度 | 输出 |
setw(int w) | 设置宽度 | 输出 |
showbase() | 打开showbase标记开关 | 输出 |
showpoint() | 打开showpoint标记开关 | 输出 |
showpos | 打开showpos标记开关 | 输出 |
skipws | 打开skipws标记开关 | 输入 |
unitbuf | 打开unitbuf标记开关 | 输出 |
uppercase | 打开uppercase标记开关 | 输出 |
ws | 跳过前导的空白字符 | 输入 |
表格11-1 C++中的输入/输出控制器
这些格式控制器通常是作为较大的输入/输出表达式的一部分来使用的。下面的程序就演示了如何使用上面提到的控制器来对输出格式进行控制:
//演示输入/输出控制器的使用
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << setprecision(2) << 1000.234 << endl;
cout << setw(20) << "Hello there.";
return 0;
}
上面程序的输出如下:
1e+003
Hello there.
注意在上面程序中控制器是如何在输入输出的链式表达式中使用的。另外,当一个控制器不需要参数的时候,例如示例程序中的endl,其后面是不需要括号的。
下面的程序演示了使用setiosflags()来设置科学计数和现实符号标记
//演示setiosflags()
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << setiosflags(ios::showpos)
<< setiosflags(ios::scientific)
<< 123 << " " << 123.23;
return 0;
}
接下来的程序演示了如何在输入字符串的时候使用 ws来跳过前导空白:
//跳过前导的空白
#include <iostream>
using namespace std;
int main()
{
char s[80];
cin >> ws >> s;
cout << s;
return 0;
}