Spec-Zone.ru › C++

std::basic_istream<CharT,Traits>::get

int_type get();
(1)
basic_istream& get( char_type& ch );
(2)
basic_istream& get( char_type* s, std::streamsize count );
(3)
basic_istream& get( char_type* s, std::streamsize count, char_type delim );
(4)
basic_istream& get( basic_streambuf& strbuf );
(5)
basic_istream& get( basic_streambuf& strbuf, char_type delim );
(6)

Извлекает символ или символы из потока.

Все версии ведут себя как неформатированные функции ввода. После создания и проверки объекта sentry эти функции выполняют следующие действия:

1) Считывает один символ и возвращает его, если он доступен. В противном случае возвращает Traits::eof() и устанавливает failbit и eofbit.
2) Считывает один символ и сохраняет его в ch, если он доступен. В противном случае оставляет ch без изменений и устанавливает failbit и eofbit. Обратите внимание, что эта функция не имеет перегрузок для типов signedchar и unsignedchar, в отличие от оператора форматированного ввода символов >>.
3) То же, что и get(s, count, widen('\n')), то есть считывает не более std::max(0, count - 1) символов и сохраняет их в строку символов, на которую указывает s, пока не будет найден '\n'.
4) Считывает символы и сохраняет их в последовательных позициях массива символов, на первый элемент которого указывает s. Символы извлекаются и сохраняются до наступления одного из следующих условий:
  • count меньше 1 или сохранено count - 1 символов.
  • в последовательности ввода наступает конец файла (вызывается setstate(eofbit)).
  • следующий доступный символ ввода c равен delim, согласно Traits::eq(c, delim). Этот символ не извлекается (в отличие от getline()).
В любом случае, если count > 0, нулевой символ (CharT() сохраняется в следующей свободной позиции массива.
5) То же, что и get(strbuf, widen('\n')), то есть считывает доступные символы и помещает их в указанный объект basic_streambuf, пока не будет найден '\n'.
6) Считывает символы и помещает их в выходную последовательность, контролируемую указанным объектом basic_streambuf. Символы извлекаются и помещаются в strbuf до наступления одного из следующих условий:
  • в последовательности ввода наступает конец файла.
  • не удается выполнить вставку в выходную последовательность (в этом случае символ, который не удалось вставить, не извлекается).
  • следующий доступный символ ввода c равен delim, согласно Traits::eq(c, delim). Этот символ не извлекается.
  • возникает исключение (в этом случае оно перехватывается и не выбрасывается повторно).

Если символы не были извлечены, вызывается setstate(failbit).

Все версии устанавливают значение gcount() равным количеству извлеченных символов.

Параметры

ch - ссылка на символ, в который записывается результат
s - указатель на строку символов для сохранения символов
count - размер строки символов, на которую указывает s
delim - символ-разделитель, при обнаружении которого извлечение прекращается. Он не извлекается и не сохраняется
strbuf - буфер потока, в который считывается содержимое

Возвращаемое значение

1) Извлеченный символ или Traits::eof().
2-6) *this

Исключения

failure, если произошла ошибка (флаг состояния ошибки не равен goodbit) и для этого состояния установлено exceptions().

Если внутренняя операция выбрасывает исключение, оно перехватывается и устанавливается badbit. Если для badbit установлено exceptions(), исключение выбрасывается повторно.

Пример

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream s1("Hello, world.");
    char c1 = s1.get(); // reads 'H'
    std::cout << "after reading " << c1 << ", gcount() == " <<  s1.gcount() << '\n';
    
    char c2;
    s1.get(c2);         // reads 'e'
    char str[5];
    s1.get(str, 5);     // reads "llo,"
    std::cout << "after reading " << str << ", gcount() == " <<  s1.gcount() << '\n';
    
    std::cout << c1 << c2 << str;
    s1.get(*std::cout.rdbuf()); // reads the rest, not including '\n'
    std::cout << "\nAfter the last get(), gcount() == " << s1.gcount() << '\n';
}

Вывод:

after reading H, gcount() == 1
after reading llo,, gcount() == 4
Hello, world.
After the last get(), gcount() == 7

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были задним числом применены к ранее опубликованным стандартам C++.

DR Применяется к Опубликованное поведение Правильное поведение
LWG 370 C++98 эффект перегрузки (5) был get(s, count, widen('\n')),
что соответствует эффекту перегрузки (3)
исправлено на
get(strbuf, widen('\n'))
LWG 531 C++98 перегрузки (3,4) не могли обработать
случай, когда count не является положительным
в этом случае
символы не извлекаются

См. также

read
извлекает блоки символов
(открытая функция-член)
operator>>
извлекает форматированные данные
(открытая функция-член)
operator>>(std::basic_istream)
извлекает символы и массивы символов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/get

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API