std::getline
| Défini dans l'en-tête <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) | (depuis 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) | (depuis C++11) |
getline lit des caractères depuis un flux d'entrée et les place dans une chaîne :
input.gcount() n'est pas affecté. Après avoir construit et vérifié l'objet sentinelle, effectue ce qui suit :str.erase().input et les ajoute à str jusqu'à ce que l'une des conditions suivantes se produise (vérifiée dans l'ordre indiqué)delim, comme testé par Traits::eq(c, delim), auquel cas le caractère délimiteur est extrait de input, mais n'est pas ajouté à str.str.max_size() des caractères ont été stockés, auquel cas getline positionne failbit et retourne.getline positionne failbit et retourne.getline(input, str, input.widen('\n')), c'est-à-dire que le délimiteur par défaut est le caractère de nouvelle ligne.Paramètres
| input | - | le flux depuis lequel obtenir les données |
| str | - | la chaîne dans laquelle placer les données |
| delim | - | le caractère délimiteur |
Valeur de retour
input
Notes
Lors de la consommation d'entrées délimitées par des espaces blancs (par ex.
int
n
;
std::
cin
>>
n
;
) tout espace blanc qui suit, y compris un caractère de nouvelle ligne, restera dans le flux d'entrée. Ensuite, lors du passage à une entrée orientée ligne, la première ligne récupérée avec
getline
sera précisément cet espace blanc. Dans le cas probable où ce comportement n'est pas souhaité, les solutions possibles incluent :
-
Un appel initial explicite superflu à
getline. - Suppression des espaces blancs consécutifs avec std:: cin >> std:: ws .
- Ignorer tous les caractères restants sur la ligne d'entrée avec cin. ignore ( std:: numeric_limits < std:: streamsize > :: max ( ) , ' \n ' ) ; .
Exemple
L'exemple suivant démontre comment utiliser la fonction
getline
pour lire l'entrée utilisateur, et traiter un flux ligne par ligne, ou par parties d'une ligne en utilisant le paramètre
delim
.
#include <iostream> #include <sstream> #include <string> int main() { // saluer l'utilisateur std::string name; std::cout << "What is your name? "; std::getline(std::cin, name); std::cout << "Hello " << name << ", nice to meet you.\n"; // lire un fichier ligne par ligne 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"; // utiliser un séparateur pour lire des parties de la ligne std::istringstream input2; input2.str("a;b;c;d"); for (std::string line; std::getline(input2, line, ';');) std::cout << line << '\n'; }
Sortie possible :
What is your name? John Q. Public Hello John Q. Public, nice to meet you. The sum is 28. a b c d
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 91 | C++98 |
getline
ne se comportait pas comme une fonction de saisie non formatée
|
se comporte comme une fonction de saisie non formatée |
Voir aussi
|
extrait des caractères jusqu'à ce que le caractère donné soit trouvé
(fonction membre publique de
std::basic_istream<CharT,Traits>
)
|