1. 簡介
其實叫它istream有點不合適,因為該頭文件不僅定義了istream
,還定義了iostream
。
2. basic_istream模版
basic_istream繼承自basic_ios,也是其它輸入流的基類。
2.1 sentry類
The class sentry defines a class that is responsible for doing exception safe prefix and suffix operations.
sentry是哨兵的意思,標准給出的解釋是,這個類是為了做一些異常安全的前置和后置工作。 所有格式化輸入函數在執行前都會構造一個sentry對象,如果該對象構造成功,這些函數會繼續執行; 否則,格式化函數會根據情況設置badbit位,並拋出異常。
2.2 格式化輸入函數
- operator >> : 該運算符有多個重載版本,分別定義了包括bool、short、unsigned等在內的多個格式化輸入。 但注意,這些函數不包括對char有關類型的重載(但C++14好像有)。
2.3 非格式化輸入函數
- gcount : 返回上一次非格式化函數提取的字符數。
- get : 提取字符。
- getline : 提取一行字符。
- ignore : 提取並且放棄字符。
- peek : “peek”下一個字符,不提取。
- read : 提取一塊字符。
- readsome : 提取內部流緩沖區存有的字符。
- putback : 放回最近提取的一個字符。
- unget : “un-get”一個字符。
2.4 流定位函數
- tellg : 返回輸入流當前字符的當前位置。
- seekg : 設置輸入流的當前位置。
2.5 同步函數
- sync : 這個函數有點難理解,它的內部調用順序是
istream::sync
->basic_streambuf::pubsync
->basic_streambuf::sync
。 因此要從底層函數的語義去理解它:將緩沖區的內容與關聯的字符流同步。 因此,如果是標准輸入流,則是將緩沖區的內容清空,保持與鍵盤輸入的同步; 如果是文件流,則是將緩沖區內容與文件內容同步。
3 basic_iostream模版
該模版只是簡單地多繼承了basic_istream和basic_ostream,並定義了幾個protected的移動賦值運算符和swap成員函數。
4 manipulators
- ws : 在當前位置提取white-space。
5 typedefs
typedef basic_istream<char> istream
typedef basic_istream<wchar_t> wistream
typedef basic_iostream<char> iostream
typedef basic_iostream<wchar_t> wiostream