namespace std { template <class charT, class traits = char_traits<charT>> class basic_istream : virtual public basic_ios<charT, traits> { public: // types (inherited from basic_ios): using char_type = charT; using int_type = typename traits::int_type; using pos_type = typename traits::pos_type; using off_type = typename traits::off_type; using traits_type = traits; // [istream.cons], constructor/destructor explicit basic_istream(basic_streambuf<charT, traits>* sb); virtual ~basic_istream(); // [istream::sentry], prefix/suffix class sentry; // [istream.formatted], formatted input basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& (*pf)(basic_istream<charT, traits>&)); basic_istream<charT, traits>& operator>>(basic_ios<charT, traits>& (*pf)(basic_ios<charT, traits>&)); basic_istream<charT, traits>& operator>>(ios_base& (*pf)(ios_base&)); basic_istream<charT, traits>& operator>>(bool& n); basic_istream<charT, traits>& operator>>(short& n); basic_istream<charT, traits>& operator>>(unsigned short& n); basic_istream<charT, traits>& operator>>(int& n); basic_istream<charT, traits>& operator>>(unsigned int& n); basic_istream<charT, traits>& operator>>(long& n); basic_istream<charT, traits>& operator>>(unsigned long& n); basic_istream<charT, traits>& operator>>(long long& n); basic_istream<charT, traits>& operator>>(unsigned long long& n); basic_istream<charT, traits>& operator>>(float& f); basic_istream<charT, traits>& operator>>(double& f); basic_istream<charT, traits>& operator>>(long double& f); basic_istream<charT, traits>& operator>>(void*& p); basic_istream<charT, traits>& operator>>(basic_streambuf<char_type, traits>* sb); // [istream.unformatted], unformatted input streamsize gcount() const; int_type get(); basic_istream<charT, traits>& get(char_type& c); basic_istream<charT, traits>& get(char_type* s, streamsize n); basic_istream<charT, traits>& get(char_type* s, streamsize n, char_type delim); basic_istream<charT, traits>& get(basic_streambuf<char_type, traits>& sb); basic_istream<charT, traits>& get(basic_streambuf<char_type, traits>& sb, char_type delim); basic_istream<charT, traits>& getline(char_type* s, streamsize n); basic_istream<charT, traits>& getline(char_type* s, streamsize n, char_type delim); basic_istream<charT, traits>& ignore(streamsize n = 1, int_type delim = traits::eof()); int_type peek(); basic_istream<charT, traits>& read (char_type* s, streamsize n); streamsize readsome(char_type* s, streamsize n); basic_istream<charT, traits>& putback(char_type c); basic_istream<charT, traits>& unget(); int sync(); pos_type tellg(); basic_istream<charT, traits>& seekg(pos_type); basic_istream<charT, traits>& seekg(off_type, ios_base::seekdir); protected: // [istream.cons], copy/move constructor basic_istream(const basic_istream& rhs) = delete; basic_istream(basic_istream&& rhs); // [istream.assign], assign and swap basic_istream& operator=(const basic_istream& rhs) = delete; basic_istream& operator=(basic_istream&& rhs); void swap(basic_istream& rhs); }; // [istream.extractors], character extraction templates template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT&); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char&); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char&); template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT*); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char*); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char*); }
Шаблон класса basic_istream определяет ряд сигнатур функций-членов, которые помогают читать и интерпретировать ввод из последовательностей, управляемых буфером потока.
Две группы сигнатур функций-членов имеют общие свойства: formatted input functions (или extractors) и unformatted input functions. Обе группы функций ввода описываются так, как если бы они получали (или extract) ввод с characters помощью вызова rdbuf()->sbumpc() или rdbuf()->sgetc(). Они могут использовать других публичных членов istream.
Если rdbuf()->sbumpc() или rdbuf()->sgetc() возвращает traits::eof(), то функция ввода, если явно не указано иное, завершает свои действия и выполняет setstate(eofbit), что может вызвать throw ios_base::failure ([iostate.flags]), перед возвратом.
Если одна из этих вызываемых функций вызывает исключение, то, если явно не указано иное, функция ввода переходит badbit в состояние ошибки. Если badbit он exceptions()включен, функция ввода повторно генерирует исключение, не завершая своих действий, в противном случае она ничего не генерирует и продолжает работу, как если бы вызываемая функция вернула индикацию сбоя.
explicit basic_istream(basic_streambuf<charT, traits>* sb);
Effects: Создает объект класса basic_istream, инициализируя подобъект базового класса с помощью basic_ios::init(sb) ([basic.ios.cons]).
basic_istream(basic_istream&& rhs);
Effects: Переместите конструкции из rvaluerhs. Это выполняется по умолчанию путем создания базового класса, копирования gcount() изrhs, вызова basic_ios<charT, traits>::move(rhs) для инициализации базового класса и установкиgcount() forrhs в 0.
virtual ~basic_istream();
basic_istream& operator=(basic_istream&& rhs);
void swap(basic_istream& rhs);
namespace std {
template <class charT, class traits = char_traits<charT>>
class basic_istream<charT, traits>::sentry {
using traits_type = traits;
bool ok_; // exposition only
public:
explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false);
~sentry();
explicit operator bool() const { return ok_; }
sentry(const sentry&) = delete;
sentry& operator=(const sentry&) = delete;
};
}
Этот класс sentry определяет класс, который отвечает за выполнение безопасных в отношении исключений операций с префиксом и суффиксом.
explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false);
Effects: Если is.good() есть false, звонитis.setstate(failbit). В противном случае готовится к форматированному или неформатированному вводу. Во-первых, если is.tie() это не нулевой указатель, функция вызывает is.tie()->flush() синхронизацию выходной последовательности с любым связанным внешним потоком C. За исключением того, что этот вызов может быть подавлен, если область размещения is.tie() пуста. Кроме того, реализации разрешается отложить вызов до flush тех пор, пока неis.rdbuf()->underflow() произойдет вызов . Если такой вызов не происходит до того, как sentry объект будет уничтожен, вызов flush может быть полностью исключен.305 Еслиnoskipws равен нулю и is.flags() & ios_base::skipws отличен от нуля, функция извлекает и отбрасывает каждый символ до тех пор, пока следующий доступный входной символc является пробельным символом. Если is.rdbuf()->sbumpc() или is.rdbuf()->sgetc() возвращается traits::eof(), функция вызывает setstate(failbit | eofbit) (который может бросить ios_base::failure).
Remarks: Конструктор
explicit sentry(basic_istream<charT, traits>& is, bool noskipws = false)
использует текущий встроенный языковой стандарт вis, чтобы определить, является ли следующий входной символ пробелом или нет.
Чтобы определить, является ли данный символc пробельным символом, конструктор работает так, как если бы он выполнял следующий фрагмент кода:
const ctype<charT>& ctype = use_facet<ctype<charT>>(is.getloc());
if (ctype.is(ctype.space, c) != 0)
// c is a whitespace character.
Если после любой препарат будет завершен, is.good() это true, вok_ != false противном случае ok_ == false. Во время подготовки конструктор может вызвать setstate(failbit) (который может throw ios_base::failure ([iostate.flags]))306
~sentry();
explicit operator bool() const;
Это будет возможно только в функциях, которые являются частью библиотеки. Семантика конструктора, используемого в пользовательском коде, указана.