当前位置: 首页 > news >正文

【C++标准库】<ios>详解基于流的 I/O

文章目录

  • 基于流的 I/O
    • 流式 I/O 的核心思想
    • 流库的类层次结构(Class Hierarchy)
  • `<ios>` :基础控制类,定义抽象基类
  • `<streambuf>`:底层设备抽象
  • `<istream>` 和 `<ostream>`:高层输入/输出接口
  • 具体流实现
  • `<fstream>` :文件流(File Streams)
  • `<sstream>`字符串 I/O 实现
  • ~~`<strstream>`~~ ~~数组 I/O 实现~~ (已弃用)
  • `<syncstream>` 同步输出流 C++20
  • 总结:流库的设计哲学


C++ 包含两个输入/输出库:

  • C 风格 I/O 函数的标准集合。<stdio.h> 详解
  • 现代的、基于流的 I/O 库

基于流的 I/O

在 C++ 中,基于流(Stream-based)的输入/输出机制是标准库中最核心、最灵活的 I/O 模型之一。它通过 抽象设备分层类设计,实现了统一接口处理文件、内存、字符串甚至自定义设备(如压缩流、网络流等)的能力。

流式 I/O 的核心思想

C++ 的流式 I/O 库围绕“抽象 I/O 设备”组织,其核心思想是:

相同的高层代码可以操作不同的底层设备,例如:

  • 文件(File)
  • 内存缓冲区(Memory Buffer)
  • 字符串(String)
  • 自定义适配器(如压缩、加密、同步输出等)

这种灵活性得益于 类模板化设计多层继承结构,使得用户无需关心底层细节,只需使用统一的 <<>> 操作符即可完成读写。

此外,所有核心类都以模板形式定义,支持任意字符类型(如 charwchar_tchar8_t 等),并通过 typedef 为常用类型提供便捷别名(如 std::string 对应 std::basic_string<char>

流库的类层次结构(Class Hierarchy)

以下是 C++ I/O 流库的主要类继承与组合关系(参考典型类图):
在这里插入图片描述


<ios> :基础控制类,定义抽象基类

  • ios_base

    非模板类,管理格式化标志(如进制、填充字符)、异常掩码、事件回调等全局状态。

  • std::basic_ios<CharT, Traits>

    类模板: 管理任意流缓冲。继承自 ios_base,绑定到具体的字符类型和特征类(Traits),负责管理一个 std::basic_streambuf<...> 对象,提供状态查询(good(), fail() 等)和格式化控制接口。


<streambuf>:底层设备抽象

  • std::basic_streambuf<CharT, Traits>

    抽象类模板,代表“原生 I/O 设备”的接口。它定义了底层字节流的读写缓冲机制(如 underflow(), overflow()),是所有具体设备实现的基础。

所有高层流类(如 ifstream, stringstream)都通过 basic_streambuf 与实际设备通信。

<istream><ostream>:高层输入/输出接口

  • std::basic_istream<CharT, Traits>

    提供高层输入操作(>>, getline() 等),内部持有 basic_streambuf 指针。

  • std::basic_ostream<CharT, Traits>

    提供高层输出操作(<<, put(), flush() 等)。

  • std::basic_iostream<CharT, Traits>

    同时继承自 basic_istreambasic_ostream,支持双向 I/O(输入+输出)。

具体流实现

场景推荐使用
读写文件<fstream> (ifstream / ofstream)
解析字符串<sstream> (istringstream)
格式化字符串<sstream> (ostringstream)
多线程输出<syncstream> (osyncstream)
自定义设备继承 basic_streambuf 并集成到流中

<fstream> :文件流(File Streams)

std::ifstream  = std::basic_ifstream<char>;
std::ofstream  = std::basic_ofstream<char>;
std::fstream   = std::basic_fstream<char>;
  • basic_filebuf类模板:basic_filebuf<CharT, Traits>

    实现 basic_streambuf 接口,封装操作系统文件句柄,提供文件的底层读写缓冲。

  • basic_ifstream类模板:basic_ifstream<CharT, Traits>

    输入文件流,实现高层文件流输入操作,继承自 basic_istream,使用 basic_filebuf 操作文件。

  • basic_ofstream类模板:basic_ofstream<CharT, Traits>

    输出文件流,实现高层文件流输出操作,继承自 basic_ostream

  • basic_fstream类模板:basic_fstream<CharT, Traits>

    双向文件流,实现高层文件流输入/输出操作,继承自 basic_iostream


<sstream>字符串 I/O 实现

std::istringstream = std::basic_istringstream<char>;
std::ostringstream = std::basic_ostringstream<char>;
std::stringstream  = std::basic_stringstream<char>;
  • basic_stringbuf类模板:basic_stringbuf<CharT, Traits, Allocator>

    实现原生字符串设备,实现 basic_streambuf,以内存中的字符串作为存储介质。

  • basic_istringstream类模板:basic_istringstream<CharT, Traits, Allocator>

    实现高层字符串流输入操作,从字符串读取数据,常用于解析字符串。

  • basic_ostringstream类模板:basic_ostringstream<CharT, Traits, Allocator>

    实现高层字符串流输出操作,向字符串写入数据,替代 sprintf 更安全。

  • basic_stringstream类模板:basic_stringstream<CharT, Traits, Allocator>

    实现高层字符串流输入/输出操作,支持双向操作的字符串流。

<strstream> 数组 I/O 实现 (已弃用)

提供基于 C 风格字符数组的流操作(istrstream, ostrstream)。
存在内存管理问题(需手动释放),已被 <sstream> 取代。

<syncstream> 同步输出流 C++20

多线程环境下,多个线程同时写 std::cout 会导致输出交错。为此 C++20 引入:

  • std::basic_syncbuf<CharT, Traits, Allocator>

    同步输出设备的包装。包装一个 basic_streambuf,确保每次写入是原子的。

  • std::basic_osyncstream<CharT, Traits, Allocator>

    同步输出流的包装。高层同步输出流,内部使用 syncbuf

示例:

#include <syncstream>
#include <thread>void worker() {std::osyncstream sync_out(std::cout);sync_out << "Hello from thread " << std::this_thread::get_id() << '\n';
}

优势:避免输出混乱,无需手动加锁。

总结:流库的设计哲学

特性说明
抽象化所有设备通过 basic_streambuf 统一抽象
模板化支持任意字符类型(char, wchar_t, UTF-8等)
分层设计底层缓冲 vs 高层操作分离,易于扩展
可扩展性可自定义 streambuf 实现压缩、加密、日志等
类型安全相比 printf/scanf,避免格式错误
http://www.xdnf.cn/news/1377037.html

相关文章:

  • 腾讯云 CVM 上的 SpringBoot 应用避免非法访问
  • 寄存器的原理
  • YOLOv8-SMOT:一种高效鲁棒的实时小目标跟踪框架:基于切片辅助训练与自适应关联
  • 人工智能-python-深度学习-反向传播优化算法
  • ESP32使用场景及大规模物联网IoT
  • 流水线用到的Dockerfile和构建脚本build.sh
  • 如何安装 mysql-installer-community-8.0.21.0.tar.gz(Linux 详细教程附安装包下载)​
  • 神经网络学习笔记11——高效卷积神经网络架构SqueezeNet
  • 聊一聊 单体分布式 和 微服务分布式
  • 深度学习——优化函数
  • 自学嵌入式第二十九天:Linux系统编程-线程
  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 在语言模型监督式微调(SFT)中的 负对数似然(Negative Log-Likelihood, NLL)等价于最大化似然
  • 软考-系统架构设计师 管理信息系统(MIS)详细讲解
  • 为什么编码智能体可以重塑开发范式?
  • 【Mascaret】QGIS中Mascaret插件的使用
  • ESP8266:Arduino学习
  • 高并发内存池(12)-ThreadCache回收内存
  • 【HTML】隐藏滚动条但保留功能
  • 什么是AI+?什么是人工智能+?
  • redis---set详解
  • ICCV 2025 | 清华IEDA提出GUAVA,单图创建可驱动的上半身3D化身!实时、高效,还能捕捉细腻的面部表情和手势。
  • 《MongoDB 常用命令详解:从数据库操作到高级查询》
  • Windows/Linux 环境下 Jmeter 性能测试的安装与使用
  • 未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)
  • Linux学习-TCP并发服务器构建
  • 在 Windows 上部署 Go 语言开发环境
  • 数据分析编程第五步:数据准备与整理
  • JoyAgent-JDGenie开源多智能体系统详解:架构、部署与企业级应用案例
  • 5G NR学习笔记 预编码(precoding)和波束赋形(beamforming)