Namespaces
Variants

std::getline

From ru.cppreference.net
 
 
 
std::basic_string
 
Определено в заголовочном файле <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) Ведёт себя как UnformattedInputFunction, за исключением того, что input.gcount() не изменяется. После создания и проверки дозорного объекта выполняет следующее:
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 не работала как нформатированная функция ввода работает как нформатированная функция ввода

Смотрите также

извлекает символы до тех пор, пока не будет найден заданный символ
(публичная функция-член std::basic_istream<CharT,Traits> )