注意一点: 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]