std::getline
| Definido en el encabezado <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) | (desde 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) | (desde C++11) |
getline Lee caracteres de un flujo de entrada y los coloca en una cadena:
input.gcount() no se ve afectado. Después de construir y verificar el objeto centinela, realiza lo siguiente:str.erase().input y los añade a str hasta que ocurre una de las siguientes condiciones (verificadas en el orden listado)delim, según lo probado por Traits::eq(c, delim), en cuyo caso el carácter delimitador se extrae de input, pero no se añade a str.getline establece failbit y retorna.getline(input, str, input.widen('\n')), es decir, el delimitador por defecto es el carácter de nueva línea.Parámetros
| input | - | el flujo del cual obtener los datos |
| str | - | la cadena donde colocar los datos |
| delim | - | el carácter delimitador |
Valor de retorno
input
Notas
Al consumir entrada delimitada por espacios en blanco (por ejemplo,
int
n
;
std::
cin
>>
n
;
) cualquier espacio en blanco que siga, incluyendo un carácter de nueva línea, permanecerá en el flujo de entrada. Luego, al cambiar a entrada orientada a líneas, la primera línea recuperada con
getline
será solo ese espacio en blanco. En el caso probable de que este comportamiento no sea deseado, las posibles soluciones incluyen:
-
Una llamada inicial explícita y extraña a
getline. - Eliminar espacios consecutivos con std:: cin >> std:: ws .
- Ignorar todos los caracteres restantes en la línea de entrada con cin. ignore ( std:: numeric_limits < std:: streamsize > :: max ( ) , ' \n ' ) ; .
Ejemplo
El siguiente ejemplo demuestra cómo utilizar la función
getline
para leer la entrada del usuario, y procesar un flujo línea por línea, o por partes de una línea usando el parámetro
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'; }
Salida posible:
What is your name? John Q. Public Hello John Q. Public, nice to meet you. The sum is 28. a b c d
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 91 | C++98 |
getline
no se comportaba como una función de entrada sin formato
|
se comporta como una función de entrada sin formato |
Véase también
|
extrae caracteres hasta encontrar el carácter especificado
(función miembro pública de
std::basic_istream<CharT,Traits>
)
|