命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | io‎ | basic istream
 
 
 
 
class sentry;

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

目录

[编辑] 成员类型

traits_type 特性

[编辑] 成员函数

(构造函数)
构造岗哨对象。所有准备任务都在这里完成。
(public member function) [编辑]
(析构函数)
在格式化输入后或异常后,如有必要,完成流对象的最终化。
(public member function) [编辑]
operator=
[已删除]
不可复制赋值
(公开成员函数)
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() 的 put 区域为空,则可以抑制此调用。实现可以将对 flush() 的调用推迟到调用 is.rdbuf()->underflow() 发生时。如果在 sentry 对象销毁之前没有发生此类调用,则可以完全取消它。

如果 noskipws 为零且 is.flags() & std::ios_base::skipws 不为零,则函数提取并丢弃所有空白字符,直到下一个可用字符不是空白字符(由 is 中当前嵌入的 locale 确定)。如果 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

[编辑] 参阅

提取格式化数据
(public member function) [编辑]
提取字符和字符数组
(function template) [编辑]