C++ 格式化输入输出
格式化输入输出是C++中非常重要的功能,它让我们能够按照特定格式显示数据或从用户输入中读取数据。下面我将从基本概念、格式化输出和格式化输入三个方面详细讲解。
一、基本概念
在C++中,我们主要通过两种方式实现格式化输入输出:
- 使用流操纵符(manipulators)
- 使用成员函数
主要涉及的流对象:
cout
- 标准输出流cin
- 标准输入流cerr
- 标准错误输出流clog
- 标准日志输出流
要使用格式化功能,需要包含<iomanip>
头文件。
二、格式化输出
1. 设置整数的进制
#include <iostream>
#include <iomanip>
int main() {
int num = 255;
std::cout << "十进制: " << num << std::endl;
std::cout << "十六进制: " << std::hex << num << std::endl;
std::cout << "八进制: " << std::oct << num << std::endl;
// 恢复十进制输出
std::cout << std::dec << num << std::endl;
return 0;
}
2. 控制浮点数显示
#include <iostream>
#include <iomanip>
int main() {
double pi = 3.141592653589793;
// 默认显示
std::cout << "默认: " << pi << std::endl;
// 固定小数点表示法,保留5位小数
std::cout << std::fixed << std::setprecision(5) << pi << std::endl;
// 科学计数法表示,保留3位小数
std::cout << std::scientific << std::setprecision(3) << pi << std::endl;
// 恢复默认显示
std::cout.unsetf(std::ios::floatfield);
std::cout << pi << std::endl;
return 0;
}
3. 设置字段宽度和填充
#include <iostream>
#include <iomanip>
int main() {
int num = 123;
// 设置宽度为10,默认右对齐
std::cout << std::setw(10) << num << std::endl;
// 设置宽度为10,左对齐
std::cout << std::left << std::setw(10) << num << "|" << std::endl;
// 设置宽度为10,填充字符为'*'
std::cout << std::setfill('*') << std::setw(10) << num << std::endl;
// 恢复默认填充字符
std::cout << std::setfill(' ');
return 0;
}
4. 其他格式化选项
#include <iostream>
#include <iomanip>
int main() {
// 显示bool值(true/false)而不是(1/0)
std::cout << std::boolalpha << true << " " << false << std::endl;
std::cout << std::noboolalpha << true << " " << false << std::endl;
// 显示前缀(0x表示16进制,0表示8进制)
std::cout << std::showbase << std::hex << 255 << std::endl;
std::cout << std::noshowbase << std::hex << 255 << std::endl;
// 正数显示+号
std::cout << std::showpos << 123 << std::endl;
std::cout << std::noshowpos << 123 << std::endl;
return 0;
}
三、格式化输入
1. 控制输入格式
#include <iostream>
#include <iomanip>
int main() {
int a, b;
std::cout << "请输入两个用空格分隔的数字: ";
std::cin >> a >> b;
std::cout << "你输入的是: " << a << " 和 " << b << std::endl;
// 重置输入流状态(如果用户输入非法数据)
std::cin.clear();
std::cin.ignore(1000, '\n'); // 忽略最多1000个字符,直到遇到换行符
return 0;
}
2. 按行输入
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "请输入你的名字: ";
std::getline(std::cin, name);
std::cout << "你好, " << name << "!" << std::endl;
return 0;
}
3. 设置输入进制
#include <iostream>
int main() {
int num;
std::cout << "请输入一个十六进制数(如ff): ";
std::cin >> std::hex >> num;
std::cout << "十进制表示: " << std::dec << num << std::endl;
return 0;
}
四、总结
C++提供了丰富的格式化输入输出功能,总结一下主要工具:
常用流操纵符:
std::setw(n)
- 设置字段宽度std::setprecision(n)
- 设置浮点数精度std::setfill(c)
- 设置填充字符std::left
/std::right
- 设置对齐方式std::fixed
/std::scientific
- 设置浮点数显示方式std::hex
/std::dec
/std::oct
- 设置整数基数
格式化输入注意事项:
- 需要检查输入是否成功
- 及时清除错误状态和缓冲区
- 对于字符串输入最好使用
std::getline
最佳实践:
- 优先使用流操纵符进行格式化
- 设置格式后要注意恢复默认设置
- 对用户输入要始终进行验证
掌握这些格式化技巧将极大提升你的C++程序与用户交互的能力和输出数据的可读性。