30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.4 Input streams [input.streams]

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.