std::basic_istream<CharT,Traits>::getline
basic_istream& getline( char_type* s, std::streamsize count ); |
(1) | |
basic_istream& getline( char_type* s, std::streamsize count, char_type delim ); |
(2) |
Извлекает символы из потока до конца строки или указанного разделителя delim.
Первый перегруз равен getline(s, count, widen('\n')).
Ведёт себя как UnformattedInputFunction. После построения и проверки объекта sentry, извлекает символы из *this и сохраняет их в последовательных позициях массива, начало которого указано в s, до тех пор, пока не произойдёт одно из следующих событий (проверяется в указанном порядке):
- В последовательности входных данных возникает состояние конца файла.
- Следующий доступный символ
cявляется разделителем, как определяетсяTraits::eq(c, delim). Разделитель извлекается (в отличие отbasic_istream::get()) и учитывается вgcount(), но не сохраняется. countне положительно, илиcount - 1символов было извлечено (setstate(failbit)вызывается в этом случае).
Если функция не извлекает ни одного символа, то failbit устанавливается в локальном состоянии ошибки перед вызовом setstate().
В любом случае, если count > 0, то затем сохраняет нулевой символ CharT() в следующую последовательную позицию массива и обновляет gcount().
Примечания
Поскольку условие #2 проверяется перед условием #3, входная строка, которая точно подходит к буферу, не вызывает failbit.
Поскольку завершающий символ учитывается как извлечённый символ, пустая входная строка не вызывает failbit.
Параметры
| s | - | указатель на строку символов для хранения символов |
| count | - | размер строки символов, на которую указывает s |
| delim | - | разделительный символ для остановки извлечения. Он извлекается, но не сохраняется. |
Возвращаемое значение
*this
Исключения
failure если произошла ошибка (флаг состояния ошибки не goodbit) и exceptions() задано бросить исключение для этого состояния. Если внутренняя операция вызывает исключение, оно перехватывается, и badbit устанавливается. Если exceptions() установлено для badbit, исключение повторно выбрасывается.
Пример
#include <array>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::istringstream input("abc|def|gh");
std::vector<std::array<char, 4>> v;
// note: the following loop terminates when std::ios_base::operator bool()
// on the stream returned from getline() returns false
for (std::array<char, 4> a; input.getline(&a[0], 4, '|');)
v.push_back(a);
for (auto& a : v)
std::cout << &a[0] << '\n';
}Вывод:
abc def gh
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| LWG 531 | C++98 |
std::getline не мог обработать случай, когда count не положительно |
ни один символ не извлекается в этом случае |
См. также
| читать данные из потока ввода-вывода в строку (шаблон функции) |
|
| извлекает отформатированные данные (общедоступный член-функция) |
|
| извлекает символы (общедоступный член-функция) |
|
| извлекает блоки символов (общедоступный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_istream/getline