Spec-Zone.ru › C++

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 считывает символы из входного потока и помещает их в строку:

1,2) Ведёт себя как неформатированная функция ввода, за исключением того, что input.gcount() не затрагивается. После создания и проверки объекта sentry выполняет следующие действия:
1) Вызывает str.erase().
2) Извлекает символы из input и добавляет их в str до наступления одного из следующих условий (проверяемых в указанном порядке):
a) условие конца файла для input; в этом случае getline устанавливает eofbit.
b) следующий доступный символ ввода является delim, что проверяется с помощью Traits::eq(c, delim); в этом случае символ-разделитель извлекается из input, но не добавляется в str.
c) сохранено str.max_size() символов; в этом случае getline устанавливает failbit и возвращает управление.
3) Если по какой-либо причине не было извлечено ни одного символа (даже отброшенного разделителя), getline устанавливает failbit и возвращает управление.
3,4) То же, что и 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 не вела себя как неформатированная функция ввода ведёт себя как неформатированная функция ввода

См. также

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

Spec-Zone.ru

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