C++ Tutorial

Standardeingabe

Eingabestream cin

Für die Standardeingabe, in der Regel ist dies die Tastatur, wird vorzugsweise der Eingabestream cin verwendet, der ebenfalls im Namensraum std definiert ist.

Wird der Eingabestream cin verwendet, ist die Datei <iostream> einzubinden.

Die Syntax für die Eingabe mittels cin lautet:

std::cin >> var1 [ >> var2 [ >> var3 ...]];

Nach dem Eingabestream cin folgt der Operator >> und dann der Name des einzulesenden Datums. Mehrere einzulesende Daten werden durch entsprechende Wiederholungen aneinandergehängt. Die Daten dürfen beliebige Datentypen haben. Es ist bei der Eingabe aber darauf zu achten, dass sich die eingegebenen Werte in den dazugehörigen Daten abspeichern lassen. Was bei fehlerhaften Eingaben passiert folgt gleich.

1: // Datei einbinden
2: #include <iostream>
3:
4: // Variablen definieren
5: short var1;
6: long var2;
7:
8: // main() Funktion
9: int main ()
10: {
11:    // 2 Daten einlesen
12:    std::cin >> var1 >> var2;
13: }

Einlesen von (alpha-)numerischen Daten

Bei der Eingabe mehrerer Daten werden die Daten durch Leerzeichen voneinander getrennt und die Eingabe wird mit <return> abgeschlossen. Die Zuordnung, Eingabe zum Datum, erfolgt von links nach rechts.

Standardmäßig werden numerischen Eingaben im Dezimalformat erwartet. Mithilfe der Manipulatoren std::hex und std::oct können Eingaben jedoch als Hex- oder Oktalwerte eingegeben werden, wobei die Eingabe optional die Präfixe 0X, 0x oder 0 zur Kennzeichnung der Zahlenbasis enthalten darf. Der Manipulator std::dec stellt die Eingabe wieder auf das Dezimalsystem um.

1: // Einlesen eines Hex-Wertes
2: short var1;
3: std::cin >> std::hex >> var1;
4: // Einlesen eines Oktal-Wertes
5: short var2;
6: std::cin >> std::oct >> var2;

Der sicherste Weg zum Einlesen von alphanumerischen Eingaben führt über das Einlesen der Daten in ein string-Objekt. Der Datentyp string liegt ebenfalls im Namensraum std und ist in der Header-Datei <string> definiert, die entsprechend einzubinden ist.

Ein string-Objekt wird wie folgt definiert:

std::string myString;
1: // Zwei string-Objekte definieren
2: std::string wort1, wort2
3: // Einlesen zweier Woerter in string-Objekte
4: std::cin >> wort1 >> wort2;

Einlesen einer Zeile

Da beim Eingabestream cin die einzelnen Eingaben durch Leerzeichen voneinander getrennt werden, sind Eingaben die selbst Leerzeichen enthalten zeilenweise einzulesen. Um eine komplette Zeile einzulesen, wird die Bibliotheksfunktion std::getline() eingesetzt.

istream& std::getline (istream& in, string& line[, char del]);

in ist der Eingabestream, aus dem die Daten ausgelesen werden, und line das string-Objekt, in dem die Daten abgelegt werden. Der letzte optionale Parameter del definiert das Zeichen, bis zu dem die Daten aus Eingabestream übernommen werden. Standardmäßig ist dies der Zeilenvorschub (RETURN).

1: #include <iostream>
2: #include <print>
3: #include <string>
4:
5: // main() Funktion
6: int main ()
7: {
8:     // string-Objekt definieren
9:     std::string input;
10:    // Hinweis ausgeben
11:    std::cout << "Bitte einen Text eingeben: ";
12:    // Zeile einlesen
13:    std::getline(std::cin, input);
14:    // Eingabe wieder ausgeben
15:    std::println("Eingabe war: {}", input);
16: }

Bitte einen Text eingeben: Eingabe mit Leerzeichen!
Eingabe war: Eingabe mit Leerzeichen!

Fehlerbehandlung

Soll mittels cin ein numerischer Wert eingelesen werden und es wurde stattdessen ein nicht-numerischer Ausdruck eingegeben, behält das einzulesende Datum seinen bisherigen Wert. Die Eingabe wird an die nächsten cin-Anweisung übergeben, die nicht-numerische Eingaben verarbeiten kann. Dieser Fehlerfall kann abgefangen werden, indem nach dem Einlesen die Methode cin.fail() aufgerufen wird. Liefert die Methode true zurück, war die Eingabe fehlerhaft. In diesem Fall ist zu beachten, dass der Fehlerstatus des Eingabestreams mit cin.clear() zu löschen ist und dass die Eingabe noch im Eingabepuffer steht!

Bestand die Eingabe eines numerischen Wertes am Anfang aus numerischen Zeichen gefolgt von nicht-numerischen Zeichen, erhält das einzulesende Datum den numerischen Teil der Eingabe zugewiesen. Der Rest der Eingabe wird wiederum an die nächste cin-Anweisung weitergeleitet, die den nicht-numerischen Teil der Eingabe verarbeiten kann. Unglücklicherweise liefert die Methode cin.fail() hier false zurück, da die Eingabe (wenigstens teilweise) erfolgreich war.

1: short var;
2: std::cin >> var;
3: // Wenn fail() true zurückgibt
4: if (std::cin.fail())
5: {
6:    // Fehler löschen und restl. Eingabe verwerfen
7:    std::cin.clear();
8:    std::cin.ignore(std::numeric_limits<int>::max(),'\n');
9: }

Beispiele für die Verarbeitung von fehlerhaften numerischen Eingaben:

Eingabe : MaxMaier
Ergebnis: Das einzulesende Datum behält seinen ursprünglichen Inhalt und fail() liefert true zurück.

Eingabe : 12MaxMaier
Ergebnis: Das einzulesende Datum erhält den Wert 12 und fail() liefert false!

Soll sichergestellt werden, dass nach jeder Eingabe der Eingabepuffer leer ist, sind eventuell noch im Eingabepuffer befindlichen Zeichen mit der Methode cin.ignore() zu verwerfen.


Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz