std::basic_istream<CharT,Traits>::sentry
class sentry; |
Объект класса basic_istream::sentry создаётся в локальной области видимости в начале каждой функции-члена std::basic_istream, выполняющей ввод (форматированный и неформатированный). Его конструктор подготавливает входной поток: проверяет, не находится ли поток уже в состоянии ошибки, сбрасывает связанные с ним выходные потоки, пропускает начальные пробельные символы, если не установлен флаг noskipws, и при необходимости выполняет другие зависящие от реализации действия. Вся необходимая очистка выполняется в деструкторе, поэтому она гарантированно происходит, даже если во время ввода выбрасываются исключения.
Типы-члены
traits_type |
Traits |
Функции-члены
| создаёт объект sentry. Здесь выполняются все подготовительные действия (открытая функция-член) |
|
| завершает работу с объектом потока после форматированного ввода или после исключения, если необходимо (открытая функция-член) |
|
|
operator=
[удалён] | оператор присваивания копированием недоступен (открытая функция-член) |
| проверяет, успешно ли выполнена подготовка объекта потока (открытая функция-член) |
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 |
См. также
| извлекает форматированные данные (открытая функция-член) |
|
| извлекает символы и массивы символов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/sentry