std::basic_istream<CharT,Traits>::sentry
class sentry; |
||
在 std::basic_istream 的每个执行输入(格式化和非格式化)的成员函数的开头,都会在局部作用域中构造 basic_istream::sentry
类的对象。它的构造函数准备输入流:检查流是否已处于失败状态,刷新 tie()'d 输出流,跳过前导空格,除非设置了 noskipws 标志,并在必要时执行其他实现定义的任务。所有清理工作(如果需要)都在析构函数中执行,从而保证在输入期间抛出异常时也会发生清理。
目录 |
[编辑] 成员类型
traits_type
|
Traits
|
[编辑] 成员函数
(构造函数) |
构造 sentry 对象。所有准备任务都在此处完成 (公有成员函数) |
(析构函数) |
在格式化输入后或异常后(如果需要),最终确定流对象 (公有成员函数) |
operator= [已删除] |
不可复制赋值 (公有成员函数) |
operator bool |
检查流对象的准备是否成功 (公有成员函数) |
std::basic_istream::sentry::sentry
explicit sentry( std::basic_istream<CharT, Traits>& is, bool noskipws = false ); |
||
为格式化输入准备流。
如果 is.good() 为 false,则调用 is.setstate(std::ios_base::failbit) 并返回。否则,如果 is.tie() 不是空指针,则调用 is.tie()->flush() 以将输出序列与外部流同步。如果 is.tie() 的 put 区域为空,则可以抑制此调用。实现可以延迟对 flush() 的调用,直到调用 is.rdbuf()->underflow() 发生。如果在 sentry 对象销毁之前没有发生这样的调用,则可以完全消除它。
如果 noskipws 为零且 is.flags() & std::ios_base::skipws 为非零,则该函数提取并丢弃所有空格字符,直到下一个可用字符不是空格字符(由当前在 is 中嵌入的区域设置确定)。如果 is.rdbuf()->sbumpc() 或 is.rdbuf()->sgetc() 返回 traits::eof(),则该函数调用 setstate(std::ios_base::failbit | std::ios_base::eofbit) (这可能会抛出 std::ios_base::failure)。
可能会发生额外的实现定义的准备工作,这可能会调用 setstate(std::ios_base::failbit) (这可能会抛出 std::ios_base::failure)。
如果在准备完成后,is.good() == true,则随后对 operator bool 的任何调用都将返回 true。
参数
is | - | 要准备的输入流 |
noskipws | - | 如果 true 则不应跳过空格 |
异常
std::ios_base::failure 如果在跳过空格时发生文件结束条件。
std::basic_istream::sentry::~sentry
~sentry(); |
||
不执行任何操作。
std::basic_istream::sentry::operator bool
explicit operator bool() const; |
||
检查输入流的准备是否成功。
参数
(无)
返回值
如果输入流的初始化成功,则为 true,否则为 false。
[编辑] 示例
#include <iostream> #include <sstream> struct Foo { char n[5]; }; std::istream& operator>>(std::istream& is, Foo& f) { std::istream::sentry s(is); if (s) is.read(f.n, 5); return is; } int main() { std::string input = " abcde"; std::istringstream stream(input); Foo f; stream >> f; std::cout.write(f.n, 5); std::cout << '\n'; }
输出
abcde
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 195 | C++98 | 不清楚构造函数是否会设置 eofbit |
已明确 |
LWG 419 | C++98 | 如果已设置 eofbit ,则构造函数未设置 failbit |
在这种情况下设置 failbit |
[编辑] 参见
提取格式化数据 (公有成员函数) | |
提取字符和字符数组 (函数模板) |