## 一.单字节操作
> `is` 表示输入流,`os` 表示输出流
| 函数 | 含义 |
| -------------------------- | ------------------------------------------------------------ |
| `istream &is.get(char &ch)` | 从输入流中读取一个字节存入 `ch`。 |
| `int is.get()` | 从输入流中读取一个字节。 |
| `ostream &is.put(char ch)` | 将字符输出到流中。 |
| `ostream &is.putback(char ch)` | 将字符放回到流中。 |
| `istream &is.unget();` | 将 `is` 向后移动一个字节,使得最后读取的值回到流中。 |
| `int is.peek();` | 将下一个字节作为 `int`返回,但不从流中删除。|
### 将字符放回流中
+ `peek` 返回输入流中下一一个字符的副本,但不会将它从流中删除,`peek` 返回的值仍然留在流中。
+ `unget` 使得输入流向后移动,从而最后读取的值又回到流中。即使我们不知道最后从流中读取什么值,仍然可以调用 `unget` 。
+ `putback` 是更特殊版本的 `unget` : 它退回从流中读取的最后一个值,但它接受一个参数,此参数必须与最后读取的值相同。
一般情况下, 在读取下一个值之前,标准库保证我们可以退回最多一个值。
## 二.多字节操作
| 函数 | 含义 |
| -------------------------- | ------------------------------------------------------------ |
| `istream &is.get(char *start,int size,char ch = '\n')` | 从 `is` 中读取最多`size` 个字节,并保存在字符数组中,字符数组的起始地址由 `start` 给出。如果遇到了 `ch` ,则将其留在输入流中,不读取出来存入 `sink`。 |
| `istream &is.getline(char *start,int size,char ch = '\n')` | 类似第一个函数,但会将 `ch` 丢掉。|
| `istream &is.read(char *start,int size)` | 一般用于二进制操作。读取 `size` 个字符到字符数组中。 |
| `ostream &is.write(char *source,int size)` | 一般用于二进制操作。写入 `size` 个字符到流中。 |
| `int is.gcount()` | 返回上一个低级I/O操作中读取的字符个数。|
| `istream &is.ignore(int n = 1,char ch = EOF)` | 跳过输人流中 `n` 个字符,或在遇到指定的终止字符 `ch` 时提前结束(也跳过终止字符)|
### 1.get 和 getline 的联系和区别
1. **联系** `get`和`getline`函数接受相同的参数,它们的行为类似但不相同。在两个函数中, `start` 都是 `char` 数组,用来保存数据。两个函数都一直读取数据,直至下面条件之一发生:
+ 已读取了 `size-1` 个字符
+ 遇到了文件尾
+ 遇到了分隔符
2. **区别**
+ `get` 遇到 `ch`时 ,指针停在终止字符。
+ `getline` 遇到 `ch`时 ,指针停在终止字符的下一个字符。
哪个函数都不会将分隔符保存在字符数组中。
| 函数或对象 | 读取方式 | 终止字符 | 遇终止字符的处理方式 |
| ---- | ---- | ---- | --------- |
| cin.get | 逐个字符读取 |可自行设定,默认是 `\n` |指针停在终止字符|
| cin.getline | 逐行读取 |可自行设定,默认是 `\n` |指针停在终止字符的下一位|
| cin | 逐个量读取 |空白字符(空格 Tab 回车)|指针停在终止字符的下一位|
#### 例1
```c++
#include <iostream>
using namespace std;
int main()
{
char test[100];
cin.get(test,100,'/');
cout<<test;
cin.getline(test,100,'/');
cout<<test;
return 0;
}
```
>[test]
>Hello World!/[按下Enter]
>Hello World!
>Press any key to continue
>[info]第二次输入时 `getline`一开始读取就因遇到`'/'`而终止了。所以并不需要用户输入。
### 2.字符串对象的输入
| 函数 | 含义 |
| -------------------------- | ------------------------------------------------------------ |
| `istream &getline(istream &is,string &s,char ch = '\n')` | 从 `is` 中读取字符并保存到字符串对象,如果遇到了 `ch` ,则将其留在输入流中,不读取出来。 |
- 阅读说明
- 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 * 其他设施