所有流均可进行高级/低级IO。
## 一.标准输入
1. 格式
```c++
cin>>var1>>var2>>...;
```
2. 流提取运算符读取数据时通常跳过输入流中的空格、Tab键、换行符等空白字符。
3. 只有在键盘输入完数据并按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。
## 二.标准输出
1.用法:
```c++
obj<<content<<...;
```
+ 这些对象已为C++的标准类型重载了<<运算符,输出数据的类型无需用户干预。但是,用户定义的类和对象需要手动重载<<运算符。
+ 一个运算符只能插入一个输出项。
2. **cout对象** *console coutput* 在控制台(终端显示器)的输出。
3. **cerr对象** *console error* 在控制台(终端显示器)显示错误信息。
+ 与 **cout** 的区别:cerr流已被指定与显示器关联,而cout可以被重定向输出到磁盘文件。
4. **clog对象** *console log* 在控制台(终端显示器)显示错误信息。
+ 与 **cerr** 的区别:cerr流不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区中,缓冲区满或遇到endl时向显示器输出。
## 三.文件流
> `fstream` 是一个文件流类,包括 `ifstream`、`ofstream`、`fstream`
| 函数或初始化语句 | 含义 |
| -------------------------- | ------------------------------------------------------------ |
| `fstream fs;` | 创建一个未绑定的文件流。 |
| `fstream fs(file);` | 创建一个文件流,并打开文件 `file`。`file` 可以是字符串对象,也可以是C风格字符串。 |
| `fstream fs(s,mode);` | 创建一个文件流,并按照模式 `mode` 打开文件 `file`。`file` 可以是字符串对象,也可以是C风格字符串。 |
| `void fs.open(file)` | 打开文件 `file`。`file` 可以是字符串对象(旧标准不支持),也可以是C风格字符串。 |
| `void obj.open(file,mode)` | 按照模式 `mode` 打开文件 `file`。`file` 可以是字符串对象,也可以是C风格字符串。 |
| `void obj.close()` | 关闭文件流。 |
| `bool obj.is_open()` | 文件是否打开。 |
+ 当文件无法打开(例如被占用)时,`failbit` 会被置位。当打开完文件后,应当检测是否打开成功:
```c++
if (fs)
//文件打开成功
```
+ 为了避免文件无法被其他程序正常打开,在文件打开完毕后,应当关闭文件。
+ 但是 `fstream` 在析构时,会自动关闭文件。
+ 关闭后,原来指定的文件模式无效。
## 四.文件打开模式
### 1.文件模式概览
>打开方式可以用 `|` 分隔开
| 方式 | 作用 |
| ----------- | ------------------------------------------------------------ |
| ios::in | **读** 打开文件 |
| ios::out | **写** **覆盖** 打开文件,如果已有此名字的文件,则将其原有内容全部擦除。 |
| ios::app | **追加** 以输出方式打开文件,每次写操作时自动定位到文件末尾 |
| ios::ate | **指向末尾** 打开一个已有的文件,文件指针指向文件末尾 |
| ios::trunc | **覆盖** 打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了 `ios::out` 方式,而未指定 `ios::app` , `ios::ate` ,`ios::in` ,则同时默认此方式。 |
| ios::binary | **二进制访问** 以二进制方式打开一个文件,如不指定此方式则默认为ASCII方式 |
### 2.文件模式限制
+ 只可以对 `ofstream` 或 `fstream` 对象设定 `out` 模式。
+ 只可以对 `ifstream` 或 `fstream` 对象设定 `in` 模式。
+ 只有当 `out` 也被设定时才可设定 `trunc` 模式。
+ 只要 `trunc` 没被设定,就可以设定 `app` 模式。在 `app` 模式下,即使没有显式指定 `out` 模式,文件也总是以输出方式被打开。
+ 默认情况下,即使我们没有指定 `trunc` ,以 `out` 模式打开的文件也会被截断。
+ `ate` 和 `binary` 模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
### 3.默认的文件模式
1. 与 `ifstream` 关联的文件默认以 `in` 模式打开。
2. 与 `ofstream` 关联的文件默认以 `out` 模式打开。
3. 与 `fstream` 关联的文件默认以 `in` 和 `out` 模式打开。
## 五.字符串流
> `sstream` 是一个字符串流类,包括 `istringstream`、`ostringstream`、`stringstream`
| 函数或初始化语句 | 含义 |
| ------------------------ | ------------------------------------ |
| `sstream ss;` | 创建一个未绑定的字符串流。 |
| `sstream ss(string &s);` | 创建一个字符串流,并拷贝字符串 `s`。 |
| `string ss.str()` | 返回字符串的拷贝。 |
| `void ss.str(string &s)` | 拷贝字符串 `s` 到流中。 |
- 阅读说明
- 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 * 其他设施