C++ I/O库核心是流抽象,统一为“读/写流”模式,主要掌握iostream(控制台)、fstream(文件)、sstream(内存字符串)三类;它们共享等接口,但连接对象不同。

C++ I/O 库的核心是流(stream)抽象,它把输入输出操作统一成“从流中读”或“向流中写”的模式,屏蔽底层设备差异。真正常用且必须掌握的是 iostream(控制台)、fstream(文件)和 sstream(内存字符串)三类流,它们共享同一套接口(如 、>>、read()、write()),但背后连接的对象不同。
iostream:标准输入输出流,面向控制台
对应对象为 std::cin(输入)、std::cout(输出)、std::cerr(错误输出,不缓冲)、std::clog(日志输出,带缓冲)。它们默认关联到终端,无需手动打开/关闭。
- 使用
std::cin >> x可以按类型自动解析(跳过空白,遇到分隔符停止),但对格式错误不报错,需检查状态:if (!std::cin) { /* 输入失败 */ } - 用
std::getline(std::cin, str)读整行(含空格),避免>>留下换行符影响后续读取 - 临时修改格式:如
std::cout 输出ff;std::cout 输出3.14(需)
fstream:文件流,读写磁盘文件
包含 std::ifstream(只读)、std::ofstream(只写)、std::fstream(读写)。构造或调用 open() 时指定文件路径和打开模式(如 std::ios::in、std::ios::out、std::ios::app、std::ios::binary)。
- 文本模式默认处理换行符转换(如 Windows 的
\r\n↔\n),二进制模式则原样读写,处理图片、音频等必须用std::ios::binary - 打开失败时流对象转为 false:
std::ifstream fin("data.txt"); if (!fin) { /* 文件不存在或无权限 */ } - 写入后记得
flush()或让对象析构(自动刷新),否则内容可能滞留在缓冲区未落盘
sstream:字符串流,内存中模拟 I/O 操作
包括 std::istringstream(从 string 读)、std::ostringstream(写入 string)、std::stringstream(双向)。适合格式化解析与拼接,替代 C 风格的 sprintf 或手动字符串拼接。
立即学习“C++免费学习笔记(深入)”;
-
std::istringstream iss("123 abc 45.6"); int a; std::string s; double d; iss >> a >> s >> d;—— 自动按空格切分并类型转换 std::ostringstream oss; oss —— 安全、类型安全的字符串构建- 注意
std::stringstream的读写位置独立,用seekg()/seekp()可移动读/写指针,类似文件定位
流状态与错误处理不能忽略
每个流对象维护内部状态标志:goodbit(正常)、failbit(格式错误或读取失败)、badbit(底层操作失败,如磁盘满)、eofbit(到达结尾)。常用成员函数:good()、fail()、bad()、eof()、clear()(重置状态)、rdstate()(获取原始状态位)。
- 不要仅靠
while (cin >> x)判断循环——它在遇到非数字输入时设 failbit 并停止,但 eofbit 不会立刻触发 - 读文件推荐方式:
while (std::getline(fin, line)) { /* 处理每行 */ },因为getline在失败时返回流本身,可自然判断 - 恢复流可用
cin.clear(); cin.ignore(std::numeric_limits<:streamsize>::max(), '\n');清空错误状态和残留输入











