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() не изменяется. После создания и проверки дозорного объекта выполняет следующее: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>
)
|