Namensräume
Varianten
Aktionen

std::getline

Von cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
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)

getline liest Zeichen aus einem Eingabestrom und legt sie in einem String ab

1,2) Verhält sich wie eine UnformattedInputFunction, mit der Ausnahme, dass input.gcount() nicht beeinflusst wird. Nach dem Erstellen und Überprüfen des Sentry-Objekts wird Folgendes ausgeführt:
1) Ruft str.erase() auf.
2) Extrahiert Zeichen aus input und hängt sie an str an, bis eine der folgenden Bedingungen eintritt (in der aufgeführten Reihenfolge geprüft):
a) End-of-File-Bedingung für input. In diesem Fall setzt getline das eofbit.
b) Das nächste verfügbare Eingabezeichen ist delim, wie durch Traits::eq(c, delim) getestet. In diesem Fall wird das Trennzeichen aus input extrahiert, aber nicht an str angehängt.
c) str.max_size() Zeichen wurden gespeichert. In diesem Fall setzt getline das failbit und kehrt zurück.
3) Wenn aus irgendeinem Grund keine Zeichen extrahiert wurden (nicht einmal das verworfene Trennzeichen), setzt getline das failbit und kehrt zurück.
3,4) Gleich wie getline(input, str, input.widen('\n')), d.h. das Standard-Trennzeichen ist das Zeilenumbruchzeichen.

Inhalt

[edit] Parameter

input - der Stream, aus dem Daten gelesen werden sollen
str - der String, in den die Daten geschrieben werden sollen
delim - das Trennzeichen

[edit] Rückgabewert

input

[edit] Hinweise

Beim Lesen von durch Leerzeichen getrennten Eingaben (z. B. int n; std::cin >> n;) bleiben alle folgenden Leerzeichen, einschließlich eines Zeilenumbruchs, im Eingabestrom erhalten. Wenn dann zu zeilenorientierter Eingabe gewechselt wird, ist die erste mit getline gelesene Zeile nur diese Leerzeichen. In dem wahrscheinlichen Fall, dass dies unerwünscht ist, sind mögliche Lösungen:

  • Ein expliziter zusätzlicher Aufruf von getline.
  • Entfernen aufeinanderfolgender Leerzeichen mit std::cin >> std::ws.
  • Ignorieren aller verbleibenden Zeichen in der Eingabezeile mit cin.ignore(std::numeric_limits::max(), '\n').

[edit] Beispiel

Das folgende Beispiel zeigt, wie die Funktion getline verwendet wird, um Benutzereingaben zu lesen und einen Stream zeilenweise oder in Teilen einer Zeile mithilfe des Parameters delim 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

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 91 C++98 getline verhielt sich nicht wie eine unformatierte Eingabefunktion verhält sich wie eine unformatierte Eingabefunktion

[edit] Siehe auch

extrahiert Zeichen, bis das gegebene Zeichen gefunden wird
(public member function of std::basic_istream<CharT,Traits>) [edit]