c++11 标准模板(STL)(std::basic_istream)(十一)

定义于头文件 <istream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_istream : virtual public std::basic_ios<CharT, Traits>

 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios 基类访问的底层 basic_streambuf 类所提供的接口实现。大多数库实现中, basic_istream 有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。

成员类

实现为输出操作准备流的基本逻辑

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

class sentry;

basic_istream::sentry 的对象在每个执行输入(有格式和无格式)的 std::basic_istream 成员函数起始的块作用域构造。其构造函数准备输入流:检查流是否已在失败状态,冲入 tie() 过的输出流,除非设置 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(failbit)(C++11 起) 并返回。否则,若 is.tie() 不是空指针,则调用 is.tie()->flush() 将输出序列与外部流同步。若 is.tie() 的放置区为空则可抑制此调用。实现可以延迟到 flush 的调用,直至出现调用 is.rdbuf()->underflow() 。若在销毁 sentry 对象前不出现这种调用,则它可被完全消除。

noskipws 为零且 is.flags() & ios_base::skipws 非零,则函数释出并舍弃所有空白符,直至下个可用字符不是空白符(由当前 is 中感染的本地环境确定)。若 is.rdbuf()->sbumpc() 或 is.rdbuf()->sgetc() 返回 traits::eof() ,则函数调用 setstate(failbit | eofbit) (可能抛出 std::ios_base::failure )。

可以发生另外的实现定义准备,可能调用 setstate(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';
}

输出

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/131736389