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 эти функции выполняют следующие действия:
Traits::eof() и устанавливает failbit и eofbit.ch, если он доступен. В противном случае оставляет ch без изменений и устанавливает failbit и eofbit. Обратите внимание, что эта функция не имеет перегрузок для типов signedchar и unsignedchar, в отличие от оператора форматированного ввода символов >>.get(s, count, widen('\n')), то есть считывает не более std::max(0, count - 1) символов и сохраняет их в строку символов, на которую указывает s, пока не будет найден '\n'.s. Символы извлекаются и сохраняются до наступления одного из следующих условий: -
countменьше1или сохраненоcount - 1символов. - в последовательности ввода наступает конец файла (вызывается
setstate(eofbit)). - следующий доступный символ ввода
cравенdelim, согласноTraits::eq(c, delim). Этот символ не извлекается (в отличие отgetline()).
count > 0, нулевой символ (CharT() сохраняется в следующей свободной позиции массива.get(strbuf, widen('\n')), то есть считывает доступные символы и помещает их в указанный объект basic_streambuf, пока не будет найден '\n'.basic_streambuf. Символы извлекаются и помещаются в strbuf до наступления одного из следующих условий: - в последовательности ввода наступает конец файла.
- не удается выполнить вставку в выходную последовательность (в этом случае символ, который не удалось вставить, не извлекается).
- следующий доступный символ ввода
cравенdelim, согласноTraits::eq(c, delim). Этот символ не извлекается. - возникает исключение (в этом случае оно перехватывается и не выбрасывается повторно).
Если символы не были извлечены, вызывается setstate(failbit).
Все версии устанавливают значение gcount() равным количеству извлеченных символов.
Параметры
| ch | - | ссылка на символ, в который записывается результат |
| s | - | указатель на строку символов для сохранения символов |
| count | - | размер строки символов, на которую указывает s |
| delim | - | символ-разделитель, при обнаружении которого извлечение прекращается. Он не извлекается и не сохраняется |
| strbuf | - | буфер потока, в который считывается содержимое |
Возвращаемое значение
Traits::eof().*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 не является положительным | в этом случае символы не извлекаются |
См. также
| извлекает блоки символов (открытая функция-член) |
|
| извлекает форматированные данные (открытая функция-член) |
|
| извлекает символы и массивы символов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/get