标准库定义了操纵符来修改流的状态,endl 就是一个操纵符,它输出一个换行符并刷新缓冲区。

控制布尔值格式
  • boolalpha 控制输出 true、false。
  • noboolalpha 取消输出 true、false,恢复默认的输出格式。
cout << "default bool values: " << true << " " << false << endl;
cout << "alpha bool values: " << boolalpha << true << " " << false << endl;
cout << noboolalpha;
cout << true << endl;


控制整型值格式

指定整型值的进制

  • oct 八进制。
  • hex 十六进制。
  • dec 十进制。
cout << "default:" << 20 << " " << 1024 << endl;  
cout << "octal:" <<oct<< 20 << " " << 1024 << endl;
cout << "hex:" << hex<<20 << " " << 1024 << endl;
cout << "decimal:" << dec << 20 << " " << 1024 << endl;


在输出中指出进制

  • showbase 显示进制。
  • noshowbase 恢复流默认状态。
cout << showbase;
cout << "default:" << 20 << " " << 1024 << endl;
cout << "in oct:" << oct<<20 << " " << 1024 << endl;
cout << "in hex:" << hex<<20 << " " << 1024 << endl;
cout << "in decimal:" << dec<<20 << " " << 1024 << endl;
cout << noshowbase;


控制浮点值格式

浮点数的输出格式控制分为:

  • 以多高的精度打印。
  • 数值是打印为十六进制、定点十进制还是科学计数法形式。
  • 没有小数部分的浮点值是否打印小数点。

默认情况下:

  • 浮点数按六位精度打印。
  • 如果浮点值没有小数部分,则不打印小数点。
  • 非常大或非常小的值打印为科学计数法形式,其它值打印为定点十进制形式。

指定打印精度

  • 调用 precision 成员。
  • 使用 setprecision 操纵符,定义在头文件 iomanip 中。
cout << "Precision: " << cout.precision() << endl; //@ 查看当前的打印精度
cout << "Values: " << sqrt(2.0) << endl;
cout.precision(12); //@ 设置打印精度
cout << "Precision:" << cout.precision() << endl;
cout << "Values: " << sqrt(2.0) << endl;
cout << setprecision(3);
cout << "Values: " << sqrt(2.0) << endl;


显示小数点

  • showpoint 对浮点值总是显示小数点。
  • noshowpoint 只有浮点值包含小数部分时才显示小数点。
cout << showpoint;
cout << 3.0 << endl;
cout << noshowpoint;
cout << 3.0 << endl;


指定浮点数计数法

  • scientific 浮点值显示为科学计数法
  • fixed 浮点值显示为定点十进制
  • hexfloat 浮点值显示为十六进制 (C++ 11)
  • defaultfloat 重置浮点数格式为十进制 (C++ 11)
cout << "default format:" << 100 * sqrt(2.0) << endl;
cout <<"scientific format:"<< scientific << 100 * sqrt(2.0) << endl;
cout <<"fixed decimal format:" << fixed <<100 * sqrt(2.0) << endl;
cout << "hex decimal format:" << hexfloat << 100 * sqrt(2.0) << endl;
cout <<"use defaults:"<<defaultfloat<< 100 * sqrt(2.0) << endl;


操纵符

iostream 中的其它操纵符

操纵符

说明

uppercase

十六进制 0X,科学计数法 E

nouppercase

十六进制 0x,科学计数法 e

showpos

对非负数显示 +

noshowpos

对非负数不显示 +

left

在值的右侧添加填充字符

right

在值的左侧添加填充字符

internal

在符号和值之间添加填充字符

unitbuf

每次输出操作后都刷新缓冲区

nounitbuf

恢复正常的缓冲区刷新方式

skipws

输入运算符跳过空白符

noskipws

输入运算符不跳过空白符

flush

刷新 ostream 缓冲区

ends

插入空字符,然后刷新 ostream 缓冲区

endl

插入换行,然后刷新 ostream 缓冲区

iomanip 中的操纵符

操纵符

说明

setfill(ch)

用 ch 填充空白

setprecision(n)

将浮点精度设置为n

set(w)

读或写值的宽度为w个字符

setbase(b)

将整数输出为b进制

int i = -16;
double d = 3.14159;

//@ 默认右对齐
cout << "i: " << setw(12) << i << endl;
cout << "d: " << setw(12) << d << endl;

cout << left; //@ 设置左对齐
cout << "i: " << setw(12) << i << endl;
cout << "d: " << setw(12) << d << endl;

//@ 恢复右对齐
cout << right;
cout << "i: " << setw(12) << i << endl;
cout << "d: " << setw(12) << d << endl;

//@ 补白第一列,但补在域的内部
cout << internal;
cout << "i: " << setw(12) << i << endl;
cout << "d: " << setw(12) << d << endl;

cout << setfill('#');
cout << "i: " << setw(12) << i << endl;
cout << "d: " << setw(12) << d << endl;
setfill(' ');


控制输入格式

默认情况下,输入运算符会忽略空白符(空格符,制表符,换行符,换纸符,回车符)。

操纵符 noskipws 会令输入运算符读取空白符,而不是跳过,恢复默认行为可以使用 skipws。

char ch;
while (cin >> ch) //@ 输入 ab c
cout << ch; //@ 输出 abc

cin >> noskipws;
while (cin >> ch) //@ ab c
cout << ch; //@ ab c
cin >> skipws;