Namespaces
Variants

std::basic_istream<CharT,Traits>:: sentry

From cppreference.net
class sentry ;

在每个执行输入操作(包括格式化和非格式化)的 std::basic_istream 成员函数开始时,会在局部作用域构造一个 basic_istream::sentry 类对象。其构造函数负责准备输入流:检查流是否已处于失败状态,刷新被关联的 tie() 输出流,除非设置了 noskipws 标志否则跳过前导空白符,并在必要时执行其他实现定义的任务。所有必要的清理工作都在析构函数中执行,从而确保即使在输入过程中抛出异常也能完成清理。

目录

成员类型

traits_type Traits

成员函数

(constructor)
构造哨兵对象。所有准备工作在此完成
(public member function)
(destructor)
在格式化输入后或异常情况下必要时完成流对象的最终处理
(public member function)
operator=
[deleted]
不可复制赋值
(public member function)
operator bool
检查流对象准备是否成功
(public member function)

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 ( ) 的放置区为空,可以抑制此调用。实现可以推迟对 flush ( ) 的调用,直到发生 is. rdbuf ( ) - > underflow ( ) 的调用。如果在哨兵对象销毁前未发生此类调用,则可以完全消除该调用。

如果 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++标准。

缺陷报告 适用标准 发布时行为 正确行为
LWG 195 C++98 未明确构造函数是否会设置 eofbit 已明确说明
LWG 419 C++98 eofbit 已被设置时,构造函数未设置 failbit 在此情况下设置 failbit

参见

提取格式化数据
(公开成员函数)
提取字符和字符数组
(函数模板)