C++输入输出 #
一、输入输出概述 #
C++使用流(stream)的概念进行输入输出操作:
cin:标准输入流(键盘)cout:标准输出流(屏幕)cerr:标准错误流(无缓冲)clog:标准日志流(有缓冲)
cpp
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
二、标准输出cout #
2.1 基本输出 #
cpp
#include <iostream>
int main() {
// 输出字符串
std::cout << "Hello";
// 输出数字
std::cout << 123;
// 输出字符
std::cout << 'A';
// 链式输出
std::cout << "Hello" << ", " << "World" << std::endl;
return 0;
}
2.2 换行方式 #
cpp
// 方式1:endl(换行并刷新缓冲区)
std::cout << "Line 1" << std::endl;
std::cout << "Line 2" << std::endl;
// 方式2:\n(只换行)
std::cout << "Line 1\n";
std::cout << "Line 2\n";
// 方式3:'\n'字符
std::cout << "Line 1" << '\n';
2.3 输出不同类型 #
cpp
#include <iostream>
#include <string>
int main() {
int i = 123;
double d = 3.14159;
char c = 'A';
bool b = true;
std::string s = "Hello";
std::cout << "int: " << i << std::endl;
std::cout << "double: " << d << std::endl;
std::cout << "char: " << c << std::endl;
std::cout << "bool: " << b << std::endl; // 输出1
std::cout << "bool: " << std::boolalpha << b << std::endl; // 输出true
std::cout << "string: " << s << std::endl;
return 0;
}
三、标准输入cin #
3.1 基本输入 #
cpp
#include <iostream>
#include <string>
int main() {
int age;
std::string name;
std::cout << "请输入年龄: ";
std::cin >> age;
std::cout << "请输入姓名: ";
std::cin >> name;
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
return 0;
}
3.2 连续输入 #
cpp
int a, b, c;
std::cin >> a >> b >> c; // 输入:10 20 30
// 空格、制表符、换行符作为分隔符
3.3 读取字符串 #
cpp
#include <iostream>
#include <string>
int main() {
std::string word;
std::string line;
// cin >> 读取单词(遇到空格停止)
std::cout << "输入单词: ";
std::cin >> word;
std::cout << "单词: " << word << std::endl;
// 清除缓冲区
std::cin.ignore();
// getline读取整行
std::cout << "输入一行: ";
std::getline(std::cin, line);
std::cout << "整行: " << line << std::endl;
return 0;
}
3.4 输入验证 #
cpp
#include <iostream>
#include <limits>
int main() {
int number;
while (true) {
std::cout << "请输入一个整数: ";
std::cin >> number;
if (std::cin.fail()) {
std::cout << "输入无效,请重新输入!" << std::endl;
std::cin.clear(); // 清除错误状态
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} else {
break;
}
}
std::cout << "你输入的数字是: " << number << std::endl;
return 0;
}
四、格式化输出 #
4.1 包含头文件 #
cpp
#include <iostream>
#include <iomanip> // 格式化控制符
4.2 宽度设置 #
cpp
#include <iostream>
#include <iomanip>
int main() {
// setw设置宽度(只对下一个输出有效)
std::cout << std::setw(10) << 123 << std::endl; // " 123"
std::cout << std::setw(10) << 123456 << std::endl; // " 123456"
// 左对齐/右对齐
std::cout << std::left << std::setw(10) << 123 << "end" << std::endl; // "123 end"
std::cout << std::right << std::setw(10) << 123 << "end" << std::endl; // " 123end"
return 0;
}
4.3 填充字符 #
cpp
#include <iostream>
#include <iomanip>
int main() {
// setfill设置填充字符
std::cout << std::setfill('0') << std::setw(5) << 123 << std::endl; // "00123"
std::cout << std::setfill('*') << std::setw(5) << 123 << std::endl; // "**123"
return 0;
}
4.4 精度设置 #
cpp
#include <iostream>
#include <iomanip>
int main() {
double pi = 3.141592653589793;
// setprecision设置精度
std::cout << std::setprecision(4) << pi << std::endl; // 3.142
// 固定小数位数
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
// 恢复默认
std::cout << std::defaultfloat << pi << std::endl;
return 0;
}
4.5 进制设置 #
cpp
#include <iostream>
int main() {
int num = 255;
// 十进制
std::cout << "十进制: " << std::dec << num << std::endl; // 255
// 十六进制
std::cout << "十六进制: " << std::hex << num << std::endl; // ff
// 八进制
std::cout << "八进制: " << std::oct << num << std::endl; // 377
// 显示进制前缀
std::cout << std::showbase;
std::cout << "十六进制: " << std::hex << num << std::endl; // 0xff
std::cout << "八进制: " << std::oct << num << std::endl; // 0377
// 大写十六进制
std::cout << std::uppercase;
std::cout << "十六进制: " << std::hex << num << std::endl; // 0XFF
return 0;
}
4.6 布尔值输出 #
cpp
#include <iostream>
int main() {
bool b = true;
// 默认输出0/1
std::cout << b << std::endl; // 1
// 输出true/false
std::cout << std::boolalpha << b << std::endl; // true
// 恢复数字输出
std::cout << std::noboolalpha << b << std::endl; // 1
return 0;
}
4.7 正号显示 #
cpp
#include <iostream>
int main() {
int num = 123;
// 显示正号
std::cout << std::showpos << num << std::endl; // +123
std::cout << -num << std::endl; // -123
// 隐藏正号
std::cout << std::noshowpos << num << std::endl; // 123
return 0;
}
五、格式化表格示例 #
cpp
#include <iostream>
#include <iomanip>
#include <string>
int main() {
std::cout << std::left;
std::cout << std::setw(10) << "姓名"
<< std::setw(8) << "语文"
<< std::setw(8) << "数学"
<< std::setw(8) << "英语"
<< std::setw(8) << "平均分" << std::endl;
std::cout << std::string(42, '-') << std::endl;
std::cout << std::setw(10) << "张三"
<< std::setw(8) << 85
<< std::setw(8) << 90
<< std::setw(8) << 78
<< std::setw(8) << std::fixed << std::setprecision(1) << 84.3 << std::endl;
std::cout << std::setw(10) << "李四"
<< std::setw(8) << 92
<< std::setw(8) << 88
<< std::setw(8) << 95
<< std::setw(8) << 91.7 << std::endl;
return 0;
}
输出:
text
姓名 语文 数学 英语 平均分
------------------------------------------
张三 85 90 78 84.3
李四 92 88 95 91.7
六、流状态 #
6.1 流状态标志 #
cpp
#include <iostream>
int main() {
int x;
// goodbit:正常状态
std::cout << std::cin.good() << std::endl; // 1
// 输入错误类型
std::cout << "输入一个整数: ";
std::cin >> x; // 如果输入非数字
// failbit:输入/输出失败
if (std::cin.fail()) {
std::cout << "输入失败" << std::endl;
std::cin.clear(); // 清除错误状态
}
// badbit:流被破坏
// eofbit:到达文件末尾
return 0;
}
6.2 状态检查 #
cpp
#include <iostream>
int main() {
int x;
// 检查流状态
while (std::cin >> x) {
std::cout << "读取到: " << x << std::endl;
}
// 检查是否到达EOF
if (std::cin.eof()) {
std::cout << "到达文件末尾" << std::endl;
}
// 检查是否失败
if (std::cin.fail()) {
std::cout << "输入失败" << std::endl;
}
return 0;
}
七、错误输出cerr和clog #
7.1 cerr(无缓冲) #
cpp
#include <iostream>
int main() {
// cerr用于错误输出,无缓冲,立即输出
std::cerr << "Error: 文件打开失败!" << std::endl;
return 0;
}
7.2 clog(有缓冲) #
cpp
#include <iostream>
int main() {
// clog用于日志输出,有缓冲
std::clog << "Log: 程序启动" << std::endl;
return 0;
}
八、常用格式化控制符 #
8.1 格式化控制符一览 #
| 控制符 | 说明 |
|---|---|
setw(n) |
设置宽度 |
setfill(c) |
设置填充字符 |
setprecision(n) |
设置精度 |
fixed |
固定小数格式 |
scientific |
科学计数法 |
hex |
十六进制 |
oct |
八进制 |
dec |
十进制 |
left |
左对齐 |
right |
右对齐 |
boolalpha |
布尔值输出true/false |
showbase |
显示进制前缀 |
showpos |
显示正号 |
uppercase |
大写输出 |
8.2 使用示例 #
cpp
#include <iostream>
#include <iomanip>
int main() {
double value = 1234.56789;
// 组合使用
std::cout << std::fixed << std::setprecision(2)
<< std::setw(12) << std::setfill('*')
<< std::right << value << std::endl;
// 输出: ****1234.57
return 0;
}
九、输入输出最佳实践 #
9.1 使用using声明 #
cpp
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main() {
cout << "Hello" << endl;
return 0;
}
9.2 避免使用using namespace std #
cpp
// 不推荐(在头文件中尤其危险)
using namespace std;
// 推荐:使用完整限定名或using声明
std::cout << "Hello" << std::endl;
9.3 输入验证 #
cpp
#include <iostream>
#include <limits>
int getInteger(const std::string& prompt) {
int value;
while (true) {
std::cout << prompt;
if (std::cin >> value) {
return value;
}
std::cout << "输入无效,请重新输入!" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
9.4 格式化输出封装 #
cpp
#include <iostream>
#include <iomanip>
void printTableHeader(const std::string headers[], int count, int width) {
for (int i = 0; i < count; i++) {
std::cout << std::setw(width) << std::left << headers[i];
}
std::cout << std::endl;
std::cout << std::string(width * count, '-') << std::endl;
}
void printTableRow(const std::string values[], int count, int width) {
for (int i = 0; i < count; i++) {
std::cout << std::setw(width) << std::left << values[i];
}
std::cout << std::endl;
}
十、总结 #
输入输出要点 #
| 流对象 | 用途 | 缓冲 |
|---|---|---|
cin |
标准输入 | 有 |
cout |
标准输出 | 有 |
cerr |
错误输出 | 无 |
clog |
日志输出 | 有 |
常用操作 #
cpp
// 输出
std::cout << "Hello" << std::endl;
// 输入
std::cin >> variable;
// 读取整行
std::getline(std::cin, line);
// 格式化
std::cout << std::setw(10) << std::setprecision(2) << value << std::endl;
下一步,让我们学习运算符!
最后更新:2026-03-26