iostream
是 C++ 标准库中用于输入输出操作的核心库,它基于面向对象的设计,提供了比 C 语言的 stdio.h
更强大、更安全的 I/O 功能。下面详细介绍 iostream
库中最常用的输入输出工具:cin
和 cout
。
一、 基本概念
iostream
库 :包含在<iostream>
头文件中,提供标准输入输出流。- 标准流对象 :
cin
:标准输入流(通常对应键盘)。cout
:标准输出流(通常对应控制台)。cerr
:标准错误流(无缓冲,直接输出)。clog
:标准日志流(有缓冲)。
二、 cout
的基本用法
输出基本数据类型
cpp
#include <iostream>
int main() {
int num = 42;
double pi = 3.14159;
char letter = 'A';
std::string name = "Alice"; // 需要包含 <string> 头文件
// 输出变量
std::cout << "整数: " << num << std::endl;
std::cout << "浮点数: " << pi << std::endl;
std::cout << "字符: " << letter << std::endl;
std::cout << "字符串: " << name << std::endl;
// 输出表达式
std::cout << "1 + 2 = " << (1 + 2) << std::endl;
return 0;
}
输出结果:
整数: 42
浮点数: 3.14159
字符: A
字符串: Alice
1 + 2 = 3
格式化输出
使用 std::endl
或 '\n'
换行:
cpp
std::cout << "第一行" << std::endl;
std::cout << "第二行\n"; // '\n' 更高效,不强制刷新缓冲区
使用 std::setw()
和 std::setfill()
控制宽度和填充字符(需包含 <iomanip>
):
cpp
#include <iomanip>
std::cout << std::setw(10) << std::setfill('*') << "Hello" << std::endl;
// 输出:*****Hello
三、 cin
的基本用法
输入基本数据类型
cpp
#include <iostream>
int main() {
int age;
double salary;
std::string name;
std::cout << "请输入姓名: ";
std::cin >> name; // 读取一个单词(空格分隔)
std::cout << "请输入年龄: ";
std::cin >> age;
std::cout << "请输入薪水: ";
std::cin >> salary;
std::cout << "姓名: " << name << ", 年龄: " << age
<< ", 薪水: " << salary << std::endl;
return 0;
}
输入示例:
请输入姓名: Alice
请输入年龄: 25
请输入薪水: 5000.5
姓名: Alice, 年龄: 25, 薪水: 5000.5
输入多行字符串
cin >>
遇到空格会停止读取,若要读取整行,使用 std::getline()
:
cpp
#include <iostream>
#include <string>
int main() {
std::string fullName;
std::cout << "请输入全名: ";
std::getline(std::cin, fullName); // 读取整行(包括空格)
std::cout << "你好, " << fullName << std::endl;
return 0;
}
四、 输入输出重定向
可以将 cin
和 cout
重定向到文件:
cpp
#include <iostream>
#include <fstream>
int main() {
// 输出重定向到文件
std::ofstream outFile("output.txt");
std::streambuf* coutBuf = std::cout.rdbuf();
std::cout.rdbuf(outFile.rdbuf());
std::cout << "这句话会写入文件" << std::endl;
// 恢复标准输出
std::cout.rdbuf(coutBuf);
std::cout << "这句话会显示在控制台" << std::endl;
return 0;
}
五、 常见问题与解决方案
1. cin
缓冲区残留问题
若先使用 cin >>
读取数值,再用 getline()
读取字符串,可能导致 getline()
读取到残留的换行符。
解决方案:
cpp
int num;
std::string line;
std::cin >> num;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清除缓冲区
std::getline(std::cin, line); // 正常读取
2. 输入验证
检查输入是否合法:
cpp
int num;
std::cout << "请输入整数: ";
if (!(std::cin >> num)) {
std::cout << "输入无效,请输入整数!" << std::endl;
std::cin.clear(); // 清除错误标志
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清除缓冲区
}
六、 进阶用法
格式化输出(精度控制)
cpp
#include <iomanip>
double pi = 3.14159265358979;
std::cout << std::fixed << std::setprecision(4) << pi << std::endl; // 输出 3.1416
自定义类型的 I/O
重载 <<
和 >>
运算符:
cpp
class Point {
private:
int x, y;
public:
// 重载 << 运算符
friend std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
// 重载 >> 运算符
friend std::istream& operator>>(std::istream& is, Point& p) {
is >> p.x >> p.y;
return is;
}
};
// 使用示例
Point p;
std::cin >> p; // 输入: 3 4
std::cout << p; // 输出: (3, 4)
七、总结
cout
:用<<
输出数据,支持链式调用(如cout << a << b
)。cin
:用>>
读取数据,默认以空格分隔,可用getline()
读取整行。- 格式化 :通过
<iomanip>
控制输出宽度、精度、填充字符等。 - 注意事项:处理输入缓冲区残留、输入验证和自定义类型的 I/O 重载。
通过这些基本操作,可以实现大多数控制台程序的输入输出功能。