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, последующие вызовы оператора 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 конструктор не устанавливал 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/w/cpp/io/basic_istream/sentry

Spec-Zone.ru

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