转自: http://www.cnblogs.com/walfud/articles/2047096.html
#include "stdafx.h"
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
int _tmain(int argc, _TCHAR* argv[])
{
// 1. 原来的状态
std::ostream::fmtflags oldFlags = std::cout.flags(); // 保存原来的状态值
std::cout.flags(oldFlags); // 恢复原先保存的状态值
// 2. bool型输出为字符/数字
std::cout <<"数字 : " << true << " / " << false << std::endl; // 以0/1的形式输出(保持原来方式)
std::cout <<"数字 : " << std::noboolalpha << true << " / " << false << std::endl; // 以0/1的形式输出(显式设置)
std::cout <<"字符 : " << std::boolalpha << true << " / " << false << std::endl; // 以true/false的形式输出
// 3. 对整形值以不同进制输出; 对浮点型无效.
int i = 255;
std::cout << "八进制 : " << std::oct << i << std::endl; // 输出: 八进制 : 377
std::cout << "十进制 : " << std::dec << i << std::endl; // 输出: 十进制 : 255
std::cout << "十六进制 : " << std::hex << i << std::endl; // 输出: 十六进制 : ff
// 3.1 设置进制的前面的字母, 例如十六进制是 0x;
std::cout << std::showbase;
std::cout << "八进制 : " << std::oct << i << std::endl; // 输出: 八进制 : 0377
std::cout << "十进制 : " << std::dec << i << std::endl; // 输出: 十进制 : 255
std::cout << "十六进制 : " << std::hex << i << std::endl; // 输出: 十六进制 : 0xff
std::cout << std::noshowbase;
// 3.2 进制中的字母是大写
std::cout << std::showbase << std::uppercase ;
std::cout << "十六进制 : " << std::hex << i << std::endl; // 输出: 十六进制 : 0XFF
std::cout << std::nouppercase ;
std::cout << "十六进制 : " << std::hex << i << std::endl; // 输出: 十六进制 : 0xff
std::cout << std::dec; // 恢复为十进制显示
// 4. 浮点型的格式化输出
// 4.1 显示前N个数字
// 显示前4个数字, 默认值为6
std::cout << std::cout.precision(4) << 12.345678 << std::endl; // 输出: 12.35 四色五入输出
// 显示前10个数字
std::cout << std::cout.precision(10) << 12.345 << std::endl; // 输出: 12.345 后面不会补0
std::cout.precision(); // 查询当前值
// 4.2 小数点后面N位与科学计数法
double d = 10 / 3.0;
std::cout.precision(6); // 配合std::fixed和std::scientific时, 就是小数点后6位.
std::cout << std::fixed << d << std::endl; // 3.333333 小数点后共6位
std::cout << std::scientific << d << std::endl; // 3.333333e+000 : 小数点后共6位
// 4.3 恢复回浮点型的格式初始设置
std::cout.unsetf(std::ostream::floatfield);
// 5. 小数点后面位数不足, 补零
std::cout.precision(6); // 配合std::fixed和std::scientific时, 就是小数点后6位.
std::cout << std::fixed << std::showpoint << 10.0 << std::endl; // 输出 : 10.000000 保留小数点后面6位数字, 不足的话补0
std::cout << std::noshowpoint << std::endl; // Revert to default handling of decimal
// 6. 设置左边填充(右对齐输出很有用)
// 6.1 左边填充, 默认是空格, 大于设定的位的话, 就正常输出了
std::cout.unsetf(std::ostream::floatfield); // 恢复一下
std::cout << std::setw(10) << 12.3 << std::endl; // 输出: ______12.3 左边补空格
std::cout << std::setw(10) << 12 << 3 << std::endl; // 输出: ________123 std::setw只对当次有效.
std::cout << std::setw(3) << 12.345 << std::endl; // 输出的内容大于设定的位的话, 就正常输出了
// 7. 对齐输出
// 7.1 左对齐/右对齐
std::cout << std::left; // 左对齐
std::cout << std::setw(5) << 12 << std::setw(5) << 34 << std::endl; // 12___34___
std::cout << std::right; // 右对齐(默认)
std::cout << std::setw(5) << 12 << std::setw(5) << 34 << std::endl; // ___12___34
std::cout << std::internal; // 负号就左对齐, 数值就右对齐
std::cout << std::setw(5) << -12 << std::endl; // -__12
// 7.2 对齐的填充
std::cout << std::setfill('*'); // 设置填充星号
std::cout << std::left; // 左对齐
std::cout << std::setw(5) << 12 << std::endl; // 12***
std::cout << std::right; // 右对齐
std::cout << std::setw(5) << 12 << std::endl; // ***12
std::cout << std::internal; // 负号就左对齐, 数值就右对齐
std::cout << std::setw(5) << -12 << std::endl; // -**12
return 0;
}