30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.4 Input streams [input.streams]

Заголовок <istream> определяет два типа и сигнатуру функции, которая управляет вводом из буфера потока, а также шаблон функции, который извлекает из потока rvalue.

30.7.4.1 Class template basic_­istream [istream]

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()включен, функция ввода повторно генерирует исключение, не завершая своих действий, в противном случае она ничего не генерирует и продолжает работу, как если бы вызываемая функция вернула индикацию сбоя.

30.7.4.1.1 basic_­istream constructors [istream.cons]

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

Effects: Создает объект класса basic_­istream, инициализируя подобъект базового класса с помощью basic_­ios​::​init(sb) ([basic.ios.cons]).

Postconditions: gcount() == 0.

basic_istream(basic_istream&& rhs);

Effects: Переместите конструкции из rvalue rhs. Это выполняется по умолчанию путем создания базового класса, копирования gcount() из rhs, вызова basic_­ios<charT, traits>​::​move(rhs) для инициализации базового класса и установки gcount() for rhs в 0.

virtual ~basic_istream();

Effects: Уничтожает объект класса basic_­istream.

Remarks: Не выполняет никаких операций rdbuf().

30.7.4.1.2 Class basic_­istream assign and swap [istream.assign]

basic_istream& operator=(basic_istream&& rhs);

Effects: Как будто мимо swap(rhs).

Returns: *this.

void swap(basic_istream& rhs);

Effects: Звонки basic_­ios<charT, traits>​::​swap(rhs). Меняет значения, возвращаемые gcount() и rhs.gcount().

30.7.4.1.3 Class basic_­istream​::​sentry [istream::sentry]

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();

Effects: Никто.

explicit operator bool() const;

Effects: Возврат ok_­.

Это будет возможно только в функциях, которые являются частью библиотеки. Семантика конструктора, используемого в пользовательском коде, указана.

Конструктор и деструктор сторожа также могут выполнять дополнительные операции, зависящие от реализации.

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]) of in. После создания 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]) of in. После создания 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&).

30.7.4.3 Unformatted input functions [istream.unformatted]

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

streamsize gcount() const;

Effects: Никто. Эта функция-член не ведет себя как неформатированная функция ввода (как описано выше).

Returns: Число символов, извлеченных последней неформатированной входной функцией-членом, вызванной для объекта.

int_type get();

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта извлекает персонажа c, если он доступен. В противном случае вызовы функции setstate(failbit), которая может throw ios_­base​::​failure ([iostate.flags]),

Returns: c если доступно, в противном случае traits​::​eof().

basic_istream<charT, traits>& get(char_type& c);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта извлекает персонажа, если он доступен, и назначает его c.311 В противном случае вызывается функция setstate(failbit) (которая может throw ios_­base​::​failure ([iostate.flags])).

Returns: *this.

basic_istream<charT, traits>& get(char_type* s, streamsize n, char_type delim);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта извлекает символы и сохраняет их в последовательных местах массива, первый элемент которого обозначен знаком s.312 Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих событий:

  • n меньше единицы или n - 1 символы сохраняются;

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

  • traits​::​eq(c, delim) для следующего доступного входного символа c (в этом случае c не извлекается).

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

Returns: *this.

basic_istream<charT, traits>& get(char_type* s, streamsize n);

Effects: Звонки get(s, n, widen('\n')).

Returns: Значение, возвращаемое вызовом.

basic_istream<charT, traits>& get(basic_streambuf<char_type, traits>& sb, char_type delim);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта извлекает символы и вставляет их в выходную последовательность, управляемую sb. Символы извлекаются и вставляются до тех пор, пока не произойдет одно из следующих событий:

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

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

  • traits​::​eq(c, delim) для следующего доступного входного символа c (в этом случае c не извлекается);

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

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

Returns: *this.

basic_istream<charT, traits>& get(basic_streambuf<char_type, traits>& sb);

Effects: Звонки get(sb, widen('\n')).

Returns: Значение, возвращаемое вызовом.

basic_istream<charT, traits>& getline(char_type* s, streamsize n, char_type delim);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта извлекает символы и сохраняет их в последовательных местах массива, первый элемент которого обозначен знаком s.313 Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих событий:

  1. 1.конец файла происходит во входной последовательности (в этом случае функция вызывает setstate(eofbit));

  2. 2.traits​::​eq(c, delim) для следующего доступного входного символа c (в этом случае входной символ извлекается, но не сохраняется);314

  3. 3.n меньше единицы или n - 1 символы сохраняются (в этом случае функция вызывает setstate(​failbit)).

Эти условия проверяются в указанном порядке.315

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

В любом случае, если n он больше нуля, он затем сохраняет нулевой символ (использование charT()) в следующем последовательном месте массива.

Returns: *this.

[Example:

#include <iostream>

int main() {
  using namespace std;
  const int line_buffer_size = 100;

  char buffer[line_buffer_size];
  int line_number = 0;
  while (cin.getline(buffer, line_buffer_size, '\n') || cin.gcount()) {
    int count = cin.gcount();
    if (cin.eof())
      cout << "Partial final line";   // cin.fail() is false
    else if (cin.fail()) {
      cout << "Partial long line";
      cin.clear(cin.rdstate() & ~ios_base::failbit);
    } else {
      count--;                        // Don't include newline in count
      cout << "Line " << ++line_number;
    }
    cout << " (" << count << " chars): " << buffer << endl;
  }
}

end example]

basic_istream<charT, traits>& getline(char_type* s, streamsize n);

Returns: getline(s, n, widen('\n'))

basic_istream<charT, traits>& ignore(streamsize n = 1, int_type delim = traits::eof());

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания объекта-часового извлекает персонажей и отбрасывает их. Символы извлекаются до тех пор, пока не произойдет одно из следующих событий:

  • n != numeric_­limits<streamsize>​::​max() и n персонажи были извлечены до сих пор

  • конец файла происходит во входной последовательности (в этом случае вызывается функция setstate(eofbit), которая может throw ios_­base​::​failure ([iostate.flags]));

  • traits​::​eq_­int_­type(traits​::​to_­int_­type(c), delim) для следующего доступного входного символа c (в этом случае c извлекается).

Remarks: Последнее условие никогда не произойдет, если traits​::​eq_­int_­type(delim, traits​::​eof()).

Returns: *this.

int_type peek();

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта считывает, но не извлекает текущий входной символ.

Returns: traits​::​eof() если good() есть false. В противном случае возвращается rdbuf()->sgetc().

basic_istream<charT, traits>& read(char_type* s, streamsize n);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта, если !good() вызовы, setstate(failbit) которые могут вызвать исключение, и возврат. В противном случае извлекает символы и сохраняет их в последовательных местах массива, первый элемент которого обозначен знаком s.317 Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих событий:

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

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

Returns: *this.

streamsize readsome(char_type* s, streamsize n);

Effects: Ведет себя как неформатированная функция ввода (как описано выше). После создания сторожевого объекта, если !good() вызовы, setstate(failbit) которые могут вызвать исключение, и возврат. В противном случае извлекает символы и сохраняет их в последовательных местах массива, первый элемент которого обозначен знаком s. Если rdbuf()->in_­avail() == -1, вызывает setstate(eofbit) (который может throw ios_­base​::​failure ([iostate.flags])) и не извлекает символы;

  • Если rdbuf()->in_­avail() == 0, не извлекает символы

  • Если rdbuf()->in_­avail() > 0, извлекает min(rdbuf()->in_­avail(), n)).

Returns: Количество извлеченных символов.

basic_istream<charT, traits>& putback(char_type c);

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что функция сначала очищается eofbit. После создания сторожевого объекта, если !good() вызовы, setstate(failbit) которые могут вызвать исключение, и возврат. Если rdbuf() не равно нулю, вызывает rdbuf->sputbackc(). Если rdbuf() имеет значение null, или если sputbackc() возвращается traits​::​eof(), вызывает setstate(badbit) (который может throw ios_­base​::​failure ([iostate.flags])). [ Note: Эта функция не извлекает символы, поэтому при следующем вызове возвращается значение gcount() 0. ]end note

Returns: *this.

basic_istream<charT, traits>& unget();

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что функция сначала очищается eofbit. После создания сторожевого объекта, если !good() вызовы, setstate(failbit) которые могут вызвать исключение, и возврат. Если rdbuf() не равно нулю, вызывает rdbuf()->sungetc(). Если rdbuf() имеет значение null, или если sungetc() возвращается traits​::​eof(), вызывает setstate(badbit) (который может throw ios_­base​::​failure ([iostate.flags])). [ Note: Эта функция не извлекает символы, поэтому при следующем вызове возвращается значение gcount() 0. ]end note

Returns: *this.

int sync();

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что она не подсчитывает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами gcount(). После создания сторожевого объекта rdbuf() возвращается пустой указатель -1. В противном случае вызывает rdbuf()->pubsync() и, если эта функция возвращает -1 вызовы setstate(badbit) (которые могут вызывать throw ios_­base​::​failure ([iostate.flags]), и возвращает -1. В противном случае возвращает ноль.

pos_type tellg();

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что она не подсчитывает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами gcount().

Returns: После создания сторожевого объекта, если fail() != false, возвращается, pos_­type(-1) чтобы указать на сбой. В противном случае возвращается rdbuf()->pubseekoff(0, cur, in).

basic_istream<charT, traits>& seekg(pos_type pos);

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что функция сначала очищает eofbit, она не подсчитывает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами gcount(). После создания сторожевого объекта if fail() != trueвыполняется rdbuf()->pubseekpos(pos, ios_­base​::​in). В случае неудачи вызовы функции setstate(failbit) (которые могут выкинуть ios_­base​::​failure).

Returns: *this.

basic_istream<charT, traits>& seekg(off_type off, ios_base::seekdir dir);

Effects: Ведет себя как неформатированная функция ввода (как описано выше), за исключением того, что функция сначала очищает eofbit, не подсчитывает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами gcount(). После создания сторожевого объекта if fail() != trueвыполняется rdbuf()->pubseekoff(off, dir, ios_­base​::​in). В случае неудачи вызовы функции setstate(​failbit) (которые могут выкинуть ios_­base​::​failure).

Returns: *this.

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

Обратите внимание, что эта функция не перегружена для типов signed char и unsigned char.

Обратите внимание, что эта функция не перегружена для типов signed char и unsigned char.

Обратите внимание, что эта функция не перегружена для типов signed char и unsigned char.

Поскольку последний входной символ «извлекается», он засчитывается в gcount(), даже если он не сохраняется.

Это позволяет вводной строке, которая точно заполняет буфер, без настройки failbit. Это отличается от исторической реализации AT&T.

Это означает, что пустая строка ввода не failbit требует установки.

Обратите внимание, что эта функция не перегружена для типов signed char и unsigned char.

30.7.4.4 Standard basic_­istream manipulators [istream.manip]

template <class charT, class traits> basic_istream<charT, traits>& ws(basic_istream<charT, traits>& is);

Effects: Ведет себя как an unformatted input function, за исключением того, что он не считает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами is.gcount (). После создания сторожевой объект извлекает символы до тех пор, пока следующий доступный символ c является пробелом, или до тех пор, пока в последовательности не останется символов. Пробельные символы различаются по тому же критерию, что и символы sentry​::​sentry. Если ws прекращает извлечение символов, потому что их больше нет, он устанавливает eofbit, но не failbit.

Returns: is.

30.7.4.5 Rvalue stream extraction [istream.rvalue]

template <class charT, class traits, class T> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&& is, T&& x);

Effects: Эквивалентен:

is >> std::forward<T>(x);
return is;

Remarks: Эта функция не должна участвовать в разрешении перегрузки, если выражение is >> std​::​forward<T>(x) не сформировано правильно.

30.7.4.6 Class template basic_­iostream [iostreamclass]

namespace std {
  template <class charT, class traits = char_traits<charT>>
  class basic_iostream
    : public basic_istream<charT, traits>,
      public basic_ostream<charT, traits> {
  public:
    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;

    // [iostream.cons], constructor
    explicit basic_iostream(basic_streambuf<charT, traits>* sb);

    // [iostream.dest], destructor
    virtual ~basic_iostream();

  protected:
    // [iostream.cons], constructor
    basic_iostream(const basic_iostream& rhs) = delete;
    basic_iostream(basic_iostream&& rhs);

    // [iostream.assign], assign and swap
    basic_iostream& operator=(const basic_iostream& rhs) = delete;
    basic_iostream& operator=(basic_iostream&& rhs);
    void swap(basic_iostream& rhs);
  };
}

Шаблон класса basic_­iostream наследует ряд функций, которые позволяют читать ввод и записывать вывод в последовательности, управляемые буфером потока.

30.7.4.6.1 basic_­iostream constructors [iostream.cons]

explicit basic_iostream(basic_streambuf<charT, traits>* sb);

Effects: Создает объект класса basic_­iostream, инициализируя подобъекты базового класса с помощью basic_­istream<charT, traits>(sb) и basic_­ostream<charT, traits>(sb).

Postconditions: rdbuf() == sb и gcount() == 0.

basic_iostream(basic_iostream&& rhs);

Effects: Перемещение конструкций из RValue rhs путем построения basic_­istream базового класса с move(rhs).

30.7.4.6.2 basic_­iostream destructor [iostream.dest]

virtual ~basic_iostream();

Effects: Уничтожает объект класса basic_­iostream.

Remarks: Не выполняет никаких операций над rdbuf().

30.7.4.6.3 basic_­iostream assign and swap [iostream.assign]

basic_iostream& operator=(basic_iostream&& rhs);

Effects: Как будто мимо swap(rhs).

void swap(basic_iostream& rhs);

Effects: Звонки basic_­istream<charT, traits>​::​swap(rhs).