std::getline
Определено в заголовке <string> | ||
|---|---|---|
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>& input,
std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
| (1) | |
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>&& input,
std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
| (2) | (начиная с C++11) |
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>& input,
std::basic_string<CharT, Traits, Allocator>& str );
| (3) | |
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>&& input,
std::basic_string<CharT, Traits, Allocator>& str );
| (4) | (начиная с C++11) |
getline считывает символы из входного потока и помещает их в строку:
input.gcount() не затрагивается. После создания и проверки объекта sentry выполняет следующие действия:str.erase().input и добавляет их в str до наступления одного из следующих условий (проверяемых в указанном порядке):delim, что проверяется с помощью Traits::eq(c, delim); в этом случае символ-разделитель извлекается из input, но не добавляется в str.str.max_size() символов; в этом случае getline устанавливает failbit и возвращает управление.getline устанавливает failbit и возвращает управление.getline(input, str, input.widen('\n')), то есть символ конца строки используется в качестве разделителя по умолчанию.Параметры
| input | - | поток, из которого считываются данные |
| str | - | строка, в которую помещаются данные |
| delim | - | символ-разделитель |
Возвращаемое значение
input
Примечания
При считывании входных данных, разделённых пробельными символами (например, int n; std::cin >> n;), любые следующие за ними пробельные символы, включая символ новой строки, остаются во входном потоке. Поэтому при переходе к построчному вводу первая строка, полученная с помощью getline, будет содержать только эти пробельные символы. Если такое поведение нежелательно, можно использовать следующие решения:
- Явно выполнить дополнительный первоначальный вызов
getline. - Удалить последовательные пробельные символы с помощью
std::cin >> std::ws. - Игнорировать все оставшиеся символы текущей строки ввода с помощью
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');.
Пример
В следующем примере показано, как использовать функцию getline для чтения пользовательского ввода, а также для обработки потока построчно или по частям строки с помощью параметра delim.
#include <iostream>
#include <sstream>
#include <string>
int main()
{
// greet the user
std::string name;
std::cout << "What is your name? ";
std::getline(std::cin, name);
std::cout << "Hello " << name << ", nice to meet you.\n";
// read file line by line
std::istringstream input;
input.str("1\n2\n3\n4\n5\n6\n7\n");
int sum = 0;
for (std::string line; std::getline(input, line);)
sum += std::stoi(line);
std::cout << "\nThe sum is " << sum << ".\n\n";
// use separator to read parts of the line
std::istringstream input2;
input2.str("a;b;c;d");
for (std::string line; std::getline(input2, line, ';');)
std::cout << line << '\n';
}
Возможный вывод:
What is your name? John Q. Public Hello John Q. Public, nice to meet you. The sum is 28. a b c d
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 91 | C++98 |
getline не вела себя как неформатированная функция ввода | ведёт себя как неформатированная функция ввода |
См. также
| извлекает символы до обнаружения указанного символа (открытая функция-член std::basic_istream<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string/getline