std::getline
| Definiert in Header <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) | (seit 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) | (seit C++11) |
getlineliest Zeichen aus einem Eingabestrom und fügt sie in eine Zeichenkette ein:
input.gcount() nicht beeinflusst wird. Nachdem das sentry-Objekt erstellt und geprüft wurde, wird Folgendes ausgeführt:str.erase().input und hängt sie an str an, bis eines der folgenden Ereignisse eintritt (in der angegebenen Reihenfolge geprüft):delim, wie durch Traits::eq(c, delim) getestet, in diesem Fall wird das Trennzeichen aus input extrahiert, aber nicht an str angehängt.str.max_size() Zeichen wurden gespeichert, in diesem Fall setzt getline failbit und kehrt zurück.getline failbit und kehrt zurück.getline(input, str, input.widen('\n')), d.h. das Standardtrennzeichen ist das Zeilenumbruchzeichen.Parameter
| input | - | der Stream, von dem Daten gelesen werden |
| str | - | die Zeichenkette, in die Daten geschrieben werden |
| delim | - | das Trennzeichen |
Rückgabewert
input
Hinweise
Beim Einlesen von durch Leerzeichen getrennten Eingaben (z.B.
int
n
;
std::
cin
>>
n
;
) wird jedes nachfolgende Leerzeichen, einschließlich eines Zeilenumbruchzeichens, im Eingabestrom verbleiben. Beim Wechsel zu zeilenorientierter Eingabe wird dann die erste mit
getline
abgerufene Zeile genau dieses Leerzeichen sein. Für den wahrscheinlichen Fall, dass dieses Verhalten unerwünscht ist, gehören zu den möglichen Lösungsansätzen:
-
Ein expliziter unnötiger initialer Aufruf von
getline. - Entfernen aufeinanderfolgender Leerzeichen mit std:: cin >> std:: ws .
- Ignorieren aller verbleibenden Zeichen in der Eingabezeile mit cin. ignore ( std:: numeric_limits < std:: streamsize > :: max ( ) , ' \n ' ) ; .
Beispiel
Das folgende Beispiel demonstriert, wie die
getline
Funktion verwendet wird, um Benutzereingaben zu lesen, und um einen Stream zeilenweise oder in Teilen einer Zeile unter Verwendung des
delim
Parameters zu verarbeiten.
#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'; }
Mögliche Ausgabe:
What is your name? John Q. Public Hello John Q. Public, nice to meet you. The sum is 28. a b c d
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 91 | C++98 |
getline
verhielt sich nicht wie eine unformatierte Eingabefunktion
|
verhält sich wie eine unformatierte Eingabefunktion |
Siehe auch
|
extrahiert Zeichen bis zum Auffinden des angegebenen Zeichens
(öffentliche Elementfunktion von
std::basic_istream<CharT,Traits>
)
|