Spec-Zone.ru › C++

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

class sentry;

Объект класса basic_istream::sentry создаётся в локальной области видимости в начале каждой функции-члена std::basic_istream, выполняющей ввод (форматированный и неформатированный). Его конструктор подготавливает входной поток: проверяет, не находится ли поток уже в состоянии ошибки, сбрасывает связанные с ним выходные потоки, пропускает начальные пробельные символы, если не установлен флаг 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() пуста. Реализация может отложить вызов 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, все последующие вызовы operatorbool будут возвращать 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 конструктор не устанавливал failbit, если был установлен eofbit в этом случае устанавливает failbit

См. также

operator>>
извлекает форматированные данные
(открытая функция-член)
operator>>(std::basic_istream)
извлекает символы и массивы символов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/sentry

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API