30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.4 Input streams [input.streams]

30.7.4.2 Formatted input functions [istream.formatted]

30.7.4.2.1 Common requirements [istream.formatted.reqmts]

Каждая функция форматированного ввода начинает выполнение с создания объекта класса sentry с noskipws (вторым) аргументом false. Если sentry объект возвращается trueпри преобразовании в значение типа bool, функция пытается получить запрошенный ввод. Если во время ввода возникает исключение, то ios​::​badbit он включается307 в *thisсостоянии ошибки. Если (exceptions()&badbit) != 0 тогда исключение генерируется повторно. В любом случае функция форматированного ввода уничтожает sentry объект. Если исключение не было создано, оно возвращается *this.

Это делается без ios​::​failure броска.

30.7.4.2.2 Arithmetic extractors [istream.formatted.arithmetic]

operator>>(unsigned short& val); operator>>(unsigned int& val); operator>>(long& val); operator>>(unsigned long& val); operator>>(long long& val); operator>>(unsigned long long& val); operator>>(float& val); operator>>(double& val); operator>>(long double& val); operator>>(bool& val); operator>>(void*& val);

Как и в случае со средствами вставки, эти экстракторы зависят отnum_­get<> объекта локали для выполнения синтаксического анализа данных входного потока. Эти экстракторы действуют как функции форматированного ввода (как описано в разделе[istream.formatted.reqmts]). После создания объекта-часового преобразование происходит так, как если бы оно выполнялось следующим фрагментом кода:

using numget = num_get<charT, istreambuf_iterator<charT, traits>>;
iostate err = iostate::goodbit;
use_facet<numget>(loc).get(*this, 0, *this, err, val);
setstate(err);

В приведенном выше фрагменте loc это закрытый член basic_­ios класса. [ Note: Первый аргумент предоставляет объект istreambuf_­iterator класса, который является итератором, указывающим на входной поток. Он обходит istreams и напрямую использует streambufs. ] Класс полагается на этот тип как на свой интерфейс , поэтому нет необходимости напрямую зависеть от него . end notelocaleistreamistream

operator>>(short& val);

Преобразование происходит так, как если бы оно было выполнено следующим фрагментом кода (с использованием тех же обозначений, что и для предыдущего фрагмента кода):

using numget = num_get<charT, istreambuf_iterator<charT, traits>>;
iostate err = ios_base::goodbit;
long lval;
use_facet<numget>(loc).get(*this, 0, *this, err, lval);
if (lval < numeric_limits<short>::min()) {
  err |= ios_base::failbit;
  val = numeric_limits<short>::min();
} else if (numeric_limits<short>::max() < lval) {
  err |= ios_base::failbit;
  val = numeric_limits<short>::max();
}  else
  val = static_cast<short>(lval);
setstate(err);

operator>>(int& val);

Преобразование происходит так, как если бы оно было выполнено следующим фрагментом кода (с использованием тех же обозначений, что и для предыдущего фрагмента кода):

using numget = num_get<charT, istreambuf_iterator<charT, traits>>;
iostate err = ios_base::goodbit;
long lval;
use_facet<numget>(loc).get(*this, 0, *this, err, lval);
if (lval < numeric_limits<int>::min()) {
  err |= ios_base::failbit;
  val = numeric_limits<int>::min();
} else if (numeric_limits<int>::max() < lval) {
  err |= ios_base::failbit;
  val = numeric_limits<int>::max();
}  else
  val = static_cast<int>(lval);
setstate(err);

30.7.4.2.3 basic_­istream​::​operator>> [istream.extractors]

basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& (*pf)(basic_istream<charT, traits>&));

Effects: Никто. Этот экстрактор не ведет себя как функция форматированного ввода (как описано в[istream.formatted.reqmts]).

Returns: pf(*this).308

basic_istream<charT, traits>& operator>>(basic_ios<charT, traits>& (*pf)(basic_ios<charT, traits>&));

Effects: Звонки pf(*this). Этот экстрактор не ведет себя как функция форматированного ввода (как описано в[istream.formatted.reqmts]).

Returns: *this.

basic_istream<charT, traits>& operator>>(ios_base& (*pf)(ios_base&));

Effects: Звонки pf(*this).309 Этот экстрактор не ведет себя как функция форматированного ввода (как описано в[istream.formatted.reqmts]).

Returns: *this.

template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT* s); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char* s); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char* s);

Effects: Ведет себя как отформатированный входной член (как описано в[istream.formatted.reqmts]) ofin. После создания sentry объекта operator>> извлекает символы и сохраняет их в последовательных местах массива, первый элемент которого обозначен знаком s. Если width() больше нуля, тоn есть width(). В противном случаеn - это количество элементов самого большого массива, в char_­type котором может храниться завершение charT(). n - максимальное количество хранимых символов.

Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих событий:

  • n-1 символы сохраняются;

  • конец файла происходит во входной последовательности;

  • пустьct будетuse_­facet<ctype<charT>>(in.getloc()), ct.is(ct.space, c) естьtrue.

operator>> затем сохраняет нулевой байт (charT()) в следующей позиции, которая может быть первой позицией, если символы не были извлечены. operator>> потом звонит width(0).

Если функция не извлекла никаких символов, она вызывает setstate(failbit), что может вызвать throw ios_­base​::​​failure ([iostate.flags]).

Returns: in.

template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT& c); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char& c); template<class traits> basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char& c);

Effects: Ведет себя как отформатированный входной член (как описано в[istream.formatted.reqmts]) ofin. После создания sentry объекта из него извлекается символin, если он доступен, и сохраняется вc. В противном случае функция вызывает in.setstate(failbit).

Returns: in.

basic_istream<charT, traits>& operator>>(basic_streambuf<charT, traits>* sb);

Effects: Ведет себя какunformatted input function. Еслиsb равно нулю, вызывает setstate(failbit), который может throw ios_­base​::​failure ([iostate.flags]). После того, как часовой объект построен, извлекает символы из *this и вставляет их в выходную последовательность, управляемуюsb. Символы извлекаются и вставляются до тех пор, пока не произойдет одно из следующих событий:

  • конец файла встречается во входной последовательности;

  • вставка в выходную последовательность не выполняется (в этом случае вставляемый символ не извлекается);

  • возникает исключение (в этом случае исключение перехватывается).

Если функция не вставляет символы, она вызывает setstate(failbit), что может вызвать throw ios_­base​::​​failure ([iostate.flags]). Если он не вставил никаких символов, потому что он поймал исключение, созданное при извлечении символов из *this и включеноfailbit в exceptions() ([iostate.flags]), то пойманное исключение генерируется повторно.

Returns: *this.

См., Например, сигнатуру функции ws(basic_­istream&).

См., Например, сигнатуру функции dec(ios_­base&).