所有流均可進行高級/低級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 * 其他設施