C++ 头文件系列(istream)
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