C++ 中的“流”(Stream)库主要由 输入/输出(I/O)流类 和 支持库 组成。它们的核心是 C++ 标准库中的 iostream,用于处理输入输出操作。以下是主要的“流”相关库及其关系:
C++ 流库的核心分类
1. 核心头文件
| 头文件 | 功能 |
|---|---|
<iostream> |
提供标准输入/输出流(std::cin, std::cout, std::cerr, std::clog)。 |
<fstream> |
提供文件输入输出流(std::ifstream, std::ofstream, std::fstream)。 |
<sstream> |
提供基于字符串的流(std::istringstream, std::ostringstream, std::stringstream)。 |
2. 核心流类
| 流类 | 描述 |
|---|---|
std::istream |
输入流基类,用于读取数据(如文件、控制台输入)。 |
std::ostream |
输出流基类,用于写入数据(如文件、控制台输出)。 |
std::iostream |
同时支持输入和输出的流基类,继承自 std::istream 和 std::ostream。 |
std::ifstream |
文件输入流,用于从文件中读取数据,继承自 std::istream。 |
std::ofstream |
文件输出流,用于向文件写入数据,继承自 std::ostream。 |
std::fstream |
文件输入输出流,继承自 std::iostream,同时支持读写。 |
std::istringstream |
字符串输入流,用于从字符串中读取数据,继承自 std::istream。 |
std::ostringstream |
字符串输出流,用于向字符串写入数据,继承自 std::ostream。 |
std::stringstream |
字符串输入输出流,继承自 std::iostream,同时支持从字符串读写数据。 |
C++ 流库的继承关系
流库的设计基于面向对象的继承,以下是主要类的继承关系:
1 | std::ios_base |
std::ios_base是最基础的类,提供流的状态和格式化操作。std::ios是所有输入输出流的公共基类,继承了std::ios_base。std::istream和std::ostream分别是输入流和输出流的基类。- 具体流类(如
std::ifstream和std::ofstream)继承自std::istream或std::ostream,并添加了文件操作功能。
流库的功能特点
1. 标准 I/O 流
std::cin: 标准输入流,用于从控制台读取数据。std::cout: 标准输出流,用于向控制台输出数据。std::cerr: 标准错误输出流,不会被缓冲,直接输出。std::clog: 标准日志输出流,会被缓冲。
2. 文件流
文件流提供了从文件读写的功能:
- 只读文件:
std::ifstream。 - 只写文件:
std::ofstream。 - 读写文件:
std::fstream。
- 只读文件:
支持文本模式(默认)和二进制模式:
1
std::ifstream file("example.txt", std::ios::binary);
3. 字符串流
字符串流提供了将字符串作为流数据源或目标的功能:
- 从字符串读取:
std::istringstream。 - 写入到字符串:
std::ostringstream。 - 既读取又写入:
std::stringstream。
- 从字符串读取:
适合用于临时的数据格式化、解析或调试:
1
2
3std::istringstream input("123 456");
int a, b;
input >> a >> b; // 从字符串中解析数据
4. 通用流操作
流的状态管理:
通过流的状态标志(如
1
std::ios::goodbit
、
1
std::ios::eofbit
)判断流是否正常:
1
2
3if (std::cin.good()) {
std::cout << "Input is good!" << std::endl;
}流的格式化操作:
通过操纵器(如
1
std::setw
、
1
std::fixed
)控制输出格式:
1
std::cout << std::setw(10) << std::setprecision(2) << std::fixed << 123.456 << std::endl;
高级流功能
1. 用户自定义流缓冲
C++ 支持自定义流缓冲(std::streambuf),允许替换流的底层实现。例如:
- 将流内容直接输出到内存。
- 实现自定义的日志记录。
2. 多线程支持
从 C++11 开始,标准库的流是线程安全的(线程间流对象不能同时访问,但单个流对象本身是安全的)。
关系总结
C++ 的流库是一个层次化的设计:
- 基础类:
std::ios_base和std::ios提供了流的基础功能。 - 具体实现:
std::istream和std::ostream定义输入输出的通用接口。 - 派生类: 文件流和字符串流通过继承实现具体功能,分别操作文件和内存中的字符串。
扩展建议
如果需要更高级的序列化功能(如跨平台、性能优化或复杂对象支持),可以结合 C++ 流库使用第三方工具,如:
- JSON 序列化: 使用
nlohmann/json库。 - 二进制序列化: 使用 Protocol Buffers、FlatBuffers 等库。