c++ I/O库详解 c++ iostream, fstream, sstream【教程】

10次阅读

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

c++ I/O库详解 c++ 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 输出 ffstd::cout 输出 3.14(需

fstream:文件流,读写磁盘文件

包含 std::ifstream(只读)、std::ofstream(只写)、std::fstream(读写)。构造或调用 open() 时指定文件路径和打开模式(如 std::ios::instd::ios::outstd::ios::appstd::ios::binary)。

  • 文本模式默认处理换行符转换(如 windows 的 rnn),二进制模式则原样读写,处理图片、音频等必须用 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'); 清空错误状态和残留输入
text=ZqhQzanResources