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 в этом случае |
См. также
| извлекает форматированные данные (публичная функция-член) |
|
| извлекает символы и массивы символов (функция-шаблон) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_istream/sentry