C++流

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::istreamstd::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
2
3
4
5
6
7
8
9
10
11
12
13
std::ios_base
├── std::ios
├── std::istream
│ ├── std::ifstream
│ ├── std::istringstream

├── std::ostream
│ ├── std::ofstream
│ ├── std::ostringstream

├── std::iostream
├── std::fstream
├── std::stringstream
  • std::ios_base 是最基础的类,提供流的状态和格式化操作。
  • std::ios 是所有输入输出流的公共基类,继承了 std::ios_base
  • std::istreamstd::ostream 分别是输入流和输出流的基类。
  • 具体流类(如 std::ifstreamstd::ofstream)继承自 std::istreamstd::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
    3
    std::istringstream input("123 456");
    int a, b;
    input >> a >> b; // 从字符串中解析数据

4. 通用流操作

  • 流的状态管理:

    通过流的状态标志(如

    1
    std::ios::goodbit

    1
    std::ios::eofbit

    )判断流是否正常:

    1
    2
    3
    if (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++ 的流库是一个层次化的设计:

  1. 基础类: std::ios_basestd::ios 提供了流的基础功能。
  2. 具体实现: std::istreamstd::ostream 定义输入输出的通用接口。
  3. 派生类: 文件流和字符串流通过继承实现具体功能,分别操作文件和内存中的字符串。

扩展建议

如果需要更高级的序列化功能(如跨平台、性能优化或复杂对象支持),可以结合 C++ 流库使用第三方工具,如:

  • JSON 序列化: 使用 nlohmann/json 库。
  • 二进制序列化: 使用 Protocol Buffers、FlatBuffers 等库。