## 一.基本概念
1. **流** 随着时间的推移,字符是顺序生成或消耗的。
2. **输入输出流** 由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象;流表示了信息从源到目的端的流动。由于流和内存缓冲区相对应,也可以说流就是缓冲区中的数据。
3. **程序的输入** 输入文件 -> 内存单元
4. **程序的输出** 内存单元 -> 输出文件
5. **C++输入输出的内容**
+ **标准输入输出(标准I/O)** 输入文件为键盘,输出文件为显示器屏幕
+ **文件输入输出(文件I/O)** 输入文件为磁盘,输出文件为磁盘
+ **字符串输入输出(串I/O)** 输入文件为内存,输出文件为内存。通常指定一个字符数组作为存储空间,但实际上可以存储任何类型的信息。
6. **低级I/O** 直接以字节为单位直接进行输入输出,在输入和输出时不进行格式转换。
+ **优点** 速度快、效率高
+ **缺点** 不直观
7. **高级I/O** 先将内存中的数据转换为ASCII字符,再按相应类型输出。通过提取运算符 `>>` 和插入运算符 `<<` 实现。
8. **文本文件** 每个字节放一个ascii代码,代表一个字符。
9. **二进制文件** 把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,就是二进制文件。
10. **缓冲区** 一个存储区域,用于保存数据。I/O设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。我们可以显式地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。
11. **打开文件**
+ 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。
+ 指定文件的工作方式,如:该文件是作为输入文件还是输出文件,是ASCII文件还是二进制文件等。
12. **关闭文件** 解除该磁盘文件与文件流的关联
13. **EOF** 文件末尾,是 `iostream` 头文件中定义的符号常量,代表 `-1`.
## 二.C++的I/O相对于C的优点
1. **类型安全**
>C++的输入输出会对数据类型进行严格的检查。
>但在C语言中用prinf和scanf函数输入输出不同类型的数时,必须分别指定相应的格式符,十分麻烦,而且容易出错。
2. **可拓展性**
>C++可以通过修改和拓充来实现自己声明的类型对象的输入输出。
>例如,C++可以通过重载插入<<运算符和提取运算符 \>\> 来实现任意类型的输出。
>但是C语言不能输出自己定义的结构体。
3. 缺点:复杂
## 三.I/O设施
### 1.I/O常用头文件
| 文件名 | 简介 |
| ---- | ---- |
| iostream |包含了对输人输出流进行操作所需的基本信息。|
| fstream |用于用户管理的文件的I/O操作。|
| strstream 或 sstream |用于字符串流I/O。|
| iomanip |在使用格式化I/O时应包含此头文件。|
### 2.I/O常用类
| 类名 | 作用 | 头文件 |
| ---- | ---- | ---- |
| istream |通用输入流和其他输入流的基类|iostream|
| ostream |通用输出流和其他输出流的基类|iostream|
| iostream |通用输入输出流和其他输入输出流的基类|iostream|
| ifstream |输入文件流类|fstream|
| ofstream |输出文件流类|fstream|
| fstream |输入输出文件流类|fstream|
| istringstream |输入字符串流类|strstream 或 sstream|
| ostringstream |输出字符串流类|strstream 或 sstream|
| stringstream |输入输入字符串流类|strstream 或 sstream|
### 2.内置I/O对象
| 对象 | 含义 | 对应类 | 对应设备 | C语言相应输入输出文件 |
| ---- | ---- | ---- | ---- | ---- |
| cin |标准输入流|istream|键盘|stdin|
| cout |标准输出流|ostream|屏幕|stdout|
| cerr |标准错误流|ostream|屏幕|stderr|
| clog |标准错误流|ostream|屏幕|stderr|
## 四.缓冲区的刷新
### 1. 刷新输出缓冲区的条件
1. 程序正常结束,作为 `main` 函数的 `return` 操作的一部分,缓冲刷新被执行。
2. 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区。
3. 使用操纵符,如 `endl` ,来显式刷新缓冲区。
4. 在每个输出操作之后,用操纵符 `unitbuf` 设置流的内部状态,来清空缓冲区。默认情况下,对 `cerr` 是设置 `unitbuf` 的,因此写到 `cerr` 的内容都是立即刷新的。
5. 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,`cin` 和 `cerr` 都关联到 `cout` 。因此,读 `cin` 或写 `cerr` 都会导致 `cout` 的缓冲区被刷新。
- 阅读说明
- 1.1 概述
- C++基础
- 1.2 变量与常量
- 1.2.1 变量
- 1.2.2 字面值常量
- 字符型常量
- 数值型常量
- 1.2.3 cv限定符
- 1.3 作用域
- 1.3.1 标识符
- 1.3.2 *命名空间
- 1.3.3 作用域
- 1.3.4 可见性
- 1.4 数据类型
- 1.4.1 概述
- 1.4.2 处理类型
- 类型别名
- * auto说明符
- * decltype说明符
- 1.4.3 数组
- 1.4.4 指针
- 1.4.5 引用
- 1.5 表达式
- 1.5.1 概述
- 1.5.2 值的类别
- 1.5.3 *初始化
- 1.5.4 运算符
- 算术运算符
- 逻辑和关系运算符
- 赋值运算符
- 递增递减运算符
- 成员访问运算符
- 位运算符
- 其他运算符
- 1.5.5 *常量表达式
- 1.5.6 类型转换
- 第2章 面向过程编程
- 2.1 流程语句
- 2.1.1 条件语句
- 2.1.2 循环语句
- 2.1.3 跳转语句
- 2.1.4 *异常处理
- 2.2 函数
- 2.2.1 概述
- 2.2.2 函数参数
- 2.2.3 内置函数
- 2.2.4 函数重载
- 2.2.5 * 匿名函数
- 2.3 存储和生命期
- 2.3.1 生命周期与存储区域
- 2.3.2 动态内存
- 2.4 *预处理命令
- 第3章 面向对象编程
- 3.1 概述
- 3.2 类和对象
- 3.3 成员
- 3.3.1 访问限制
- 3.3.2 常成员
- 3.3.3 静态成员
- 3.3.4 成员指针
- 3.3.5 this指针
- 3.4 特殊的成员函数
- 3.4.1 概述
- 3.4.2 构造函数
- 3.4.3 析构函数
- 3.4.4 拷贝语义
- 3.4.5 * 移动语义
- 3.5 友元
- 3.6 运算符重载与类型转换
- 3.6.1 概述
- 3.6.2 重载方法
- 3.6.3 类型转换
- 3.7 继承与多态性
- 3.7.1 概述
- 3.7.2 派生类
- 3.7.3 子类型
- 3.7.4 虚基类
- 3.7.5 虚函数
- 3.7.6 抽象类
- 3.8 模板与泛型
- 3.8.1 概述
- 3.8.2 模板类型
- 3.8.3 *模板参数
- 3.8.4 *模板编译
- 3.8.5 *模板推断
- 3.8.6 *实例化与特例化
- 第4章 C++标准库
- 4.1 概述
- 4.2 输入输出流
- 4.2.1 概述
- 4.2.2 *流的状态
- 4.2.3 *常用流
- 4.2.4 *格式化I/O
- 4.2.5 *低级I/O
- 4.2.6 *随机访问
- 4.3 *C输入输出
- 4.3.1 *字符输入输出
- 4.3.2 *格式化输入输出
- 4.4 * 容器
- 4.4.1 * 概述
- 4.4.2 * 基本操作
- 4.4.3 * 顺序容器
- 4.4.4 * 迭代器
- 4.4.5 * 容器适配器
- 4.5 * 泛型算法
- 4.6 * 内存管理
- 4.6.1 * 自动指针
- 4.7 * 其他设施