<iomanip>
是 C++ 标准库中一个非常重要的头文件,它提供了一组用于输入/输出流格式化的工具。通过这些工具,程序员可以方便地调整输出格式,比如设置宽度、对齐方式、精度等。
1. 基本概念
<iomanip>
提供了一些流操纵器(manipulators),这些操纵器可以通过插入操作符(<<
或 >>
)与流对象结合使用,用来改变流的行为。例如,可以控制小数点位数、设置输出宽度等。
这些操纵器可以分为两类:
- 状态操纵器:改变流的状态,直到显式更改为止(如
std::setprecision
)。 - 非状态操纵器:只对当前操作生效(如
std::setw
)。
2. 常用操纵器
2.1 设置宽度:std::setw
- 功能:设置输出的宽度(字符数)。如果数据长度小于宽度,默认用空格填充。
- 作用范围:仅对当前流操作有效。
- 语法:
std::setw(n)
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::setw(10) << 42 << std::endl; // 输出: 42 std::cout << 42 << std::endl; // 输出:42 return 0; }
2.2 填充字符:std::setfill
- 功能:设置宽度不足时填充的字符。
- 作用范围:直到显式更改为止。
- 语法:
std::setfill(c)
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::setfill('*') << std::setw(10) << 42 << std::endl; // 输出:********42 return 0; }
2.3 对齐方式:std::left
、std::right
、std::internal
- 功能:设置输出内容的对齐方式。
std::left
:左对齐。std::right
:右对齐(默认)。std::internal
:符号靠左,其余部分右对齐(常用于数字)。
- 作用范围:直到显式更改为止。
- 语法:
std::left std::right std::internal
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::left << std::setw(10) << 42 << std::endl; // 输出:42 std::cout << std::right << std::setw(10) << 42 << std::endl; // 输出: 42 std::cout << std::internal << std::setw(10) << -42 << std::endl; // 输出:- 42 return 0; }
2.4 设置浮点数精度:std::setprecision
- 功能:设置浮点数的有效位数(默认是总位数,结合
std::fixed
或std::scientific
可改变行为)。 - 作用范围:直到显式更改为止。
- 语法:
std::setprecision(n)
- 示例:
#include <iostream> #include <iomanip> int main() { double pi = 3.14159265358979; std::cout << std::setprecision(5) << pi << std::endl; // 输出:3.1416 std::cout << std::fixed << std::setprecision(5) << pi << std::endl; // 输出:3.14159 return 0; }
2.5 固定小数点与科学计数法:std::fixed
和 std::scientific
- 功能:
std::fixed
:以固定小数点格式输出浮点数。std::scientific
:以科学计数法格式输出浮点数。
- 作用范围:直到显式更改为止。
- 语法:
std::fixed std::scientific
- 示例:
#include <iostream> #include <iomanip> int main() { double pi = 3.14159265358979; std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 输出:3.14 std::cout << std::scientific << std::setprecision(2) << pi << std::endl; // 输出:3.14e+00 return 0; }
2.6 显示符号:std::showpos
和 std::noshowpos
- 功能:
std::showpos
:对正数显示+
符号。std::noshowpos
:关闭符号显示(默认)。
- 作用范围:直到显式更改为止。
- 语法:
std::showpos std::noshowpos
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::showpos << 42 << std::endl; // 输出:+42 std::cout << std::noshowpos << 42 << std::endl; // 输出:42 return 0; }
2.7 显示进制:std::hex
、std::oct
、std::dec
- 功能:
std::hex
:以十六进制输出。std::oct
:以八进制输出。std::dec
:以十进制输出(默认)。
- 作用范围:直到显式更改为止。
- 语法:
std::hex std::oct std::dec
- 示例:
#include <iostream> #include <iomanip> int main() { int num = 42; std::cout << std::dec << num << std::endl; // 输出:42 std::cout << std::hex << num << std::endl; // 输出:2a std::cout << std::oct << num << std::endl; // 输出:52 return 0; }
2.8 显示进制前缀:std::showbase
和 std::noshowbase
- 功能:
std::showbase
:显示进制的前缀(如0x
表示十六进制,0
表示八进制)。std::noshowbase
:关闭前缀显示(默认)。
- 作用范围:直到显式更改为止。
- 语法:
std::showbase std::noshowbase
- 示例:
#include <iostream> #include <iomanip> int main() { int num = 42; std::cout << std::showbase << std::hex << num << std::endl; // 输出:0x2a std::cout << std::noshowbase << std::oct << num << std::endl; // 输出:52 return 0; }
2.9 大小写控制:std::uppercase
和 std::nouppercase
- 功能:
std::uppercase
:大写输出字母(如十六进制中的A-F
)。std::nouppercase
:小写输出字母(默认)。
- 作用范围:直到显式更改为止。
- 语法:
std::uppercase std::nouppercase
- 示例:
#include <iostream> #include <iomanip> int main() { int num = 42; std::cout << std::hex << std::uppercase << num << std::endl; // 输出:2A std::cout << std::nouppercase << num << std::endl; // 输出:2a return 0; }
2.10 固定布尔值格式:std::boolalpha
和 std::noboolalpha
- 功能:
std::boolalpha
:布尔值以true
或false
输出。std::noboolalpha
:布尔值以1
或0
输出(默认)。
- 作用范围:直到显式更改为止。
- 语法:
std::boolalpha std::noboolalpha
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::boolalpha << true << std::endl; // 输出:true std::cout << std::noboolalpha << true << std::endl; // 输出:1 return 0; }
2.11 重置格式:std::resetiosflags
和 std::setiosflags
- 功能:
std::resetiosflags
:重置指定的格式标志。std::setiosflags
:设置指定的格式标志。
- 作用范围:直到显式更改为止。
- 语法:
std::resetiosflags(flag) std::setiosflags(flag)
- 示例:
#include <iostream> #include <iomanip> int main() { std::cout << std::setiosflags(std::ios::fixed | std::ios::showpos) << std::setprecision(2) << 42.5 << std::endl; // 输出:+42.50 std::cout << std::resetiosflags(std::ios::showpos) << 42.5 << std::endl; // 输出:42.50 return 0; }
3. 总结
<iomanip>
提供了丰富的流操纵器,可以灵活地控制输出格式。这些操纵器在调试、日志记录和用户界面设计中非常有用。掌握这些工具,可以极大地提高程序的可读性和美观性。