C++ ostream 常用格式


注意一点: std::setw只对下一个输出值有效,其他选项所有随后的输出都有效,比如:

case: std::cout << "[" << std::setw(6) << std::setfill('0') << "AAAA" << "BBBB" << "]";         // [00AAAABBBB]
可见"AAAA"被扩展成了6个字符宽度,而BBBB没有被扩展;因为std::setw只对紧跟着的输出有效, 即只对输出"AAAA"有效,而对"BBBB"输出无效。虽然std::setfill对输出"BBBB"还是有效的, 但是因为长度限定, "BBBB"的输出不需要padding也就看不出setfill起作用了,看下面case 2例子就明白。
case: std::cout << "[" << std::setw(6) << std::setfill('0') << "AAAA" << std::setw(6) << "BBBB" << "]"; // [00AAAA00BBBB]
可以看出setfill对所有的后续输出都有效。

1. setw: 设定下一个输出域的宽度
case: std::cout << "[" << std::setw(8) << "AAAA" << "]";        // [    AAAA]
设定域的输出长度为6,而实际字符串长度为4,所有前面补四个空格。
如果setw的数值小于实际数据长度,setw的值无效,比如上述例子:
case: std::cout << "[" << std::setw(3) << "AAAA" << "]"         // [AAAA]
因为3小于实际字符串长度4,最终输出整个字符串。

2. left/right/internal:在设定了输出域的宽度setw后,如果设置对齐方式,左对齐还是右对齐
case: std::cout << "[" << std::setw(8) << std::left << "AAAA" << "]";       // [AAAA    ]
case: std::cout << "[" << std::setw(8) << std::right << "AAAA" << "]";      // [    AAAA]
case: std::cout << "[" << std::setw(8) << "AAAA" << "]";                    // [    AAAA]
缺省是右对齐(std::right)
关于选项internal,在后面输出数字的时候再讨论;另外没有居中对齐这个选项。

3. setfill:域宽度不够时,还可以指定填充字符,用来代替缺省的空格
case: std::cout << "[" << std::setw(8) << std::setfill('0') << "AAAA" << "]"; // [0000AAAA]
使用字符'0'作为填充
case: std::cout << "[" << std::setw(8) << std::setfill('0') << std::left << "AAAA" << "]";    // [AAAA0000]

4. showpos:输出数字的正负号
case: std::cout << "[" << std::showpos << 123 << "]";   // [+123]
case: std::cout << "[" << std::showpos << -456 << "]";  // [-456]
case: std::cout << "[" << std::showpos << 0 << "]";     // [+0]

也可以指定数字域宽度setw
case: std::cout << "[" << std::showpos << std::setw(8) << 123 << "]";    // [    +123]
case: std::cout << "[" << std::showpos << std::setw(8) << -456 << "]";   // [    -456]
case: std::cout << "[" << std::showpos << std::setw(8) << 0 << "]";      // [      +0]

设定fill
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << 123  << "]";    // [0000+123]
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << -456 << "]";    // [ 0000-456]
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << 0    << "]";    // [ 000000+0]

这显然不是我们想要的结果,此时对齐方式中的internal就有用处了。
internal的定义是在符号位和数值之间填充
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << 123  << "]";   // [ +0000123]
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << -456 << "]";   // [- 0000456]
case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << 0    << "]";   // [ +0000000]

5. 输出16进制数字值
case: std::cout << "[" << std::hex << 5  << "]";    // [5]
case: std::cout << "[" << std::hex << 10  << "]";   // [a]
case: std::cout << "[" << std::hex << 20  << "]";   //  [14]

能不能把长度限定为两个字节
case: std::cout << "[" << std::hex << std::setw(2) << 5  << "]";    // [ 5]
case: std::cout << "[" << std::hex << std::setw(2) << 10  << "]";   // [ a]
case: std::cout << "[" << std::hex << std::setw(2) << 20  << "]";   // [14]

前面空格用0来代替就好了
case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";   // [05]
case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 10  << "]";  // [0a]
case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 20  << "]";  // [14]

能不能加前缀0x
case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";  // [0x5]
case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 10  << "]"; // [0xa]
case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 20  << "]"; // [0x14]

可是为什么不能0x05, 0x0a, 0x14呢,因为setw(2)已经超出长度了,那如果设置setw(4)行不行啊
case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 5  << "]";  // [00x5]
case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 10  << "]"; // [00xa]
case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 20  << "]"; // [0x14]

看来不行了,只能使用原始的笨办法
std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";     // [0x05]
std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 10  << "]";    // [0x0a]
std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 20  << "]";    // [0x14]

能不能16进制值(a-f)变大写
std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 5  << "]";   // [05]
std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 10  << "]";  // [0A]
std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 20  << "]";  // [14]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值