C++ Tutorial

 Standardeingabe

Eingabestream cin

Die Eingabe von Daten von der Standardeingabe, dies ist in der Regel die Tastatur, erfolgt u.a. mittels des Eingabestreams cin. Die allgemeine Syntax für die Eingabe mittels cin lautet:

std::cin >> DATUM1 [>> DATUM2 ...];

Nach dem Eingabestream cin folgt der Operator >> sowie der Name des einzulesenden Datums. Mehrere einzulesende Daten werden durch entsprechende Wiederholungen aneinandergehängt. Und auch hier muss, wie beim Ausgabestream cout, das Präfix std:: stehen, da cin ebenfalls in der Standardbibiliothek definiert ist, und es ist ebenfalls die Headerdatei <iostream> einzubinden.

// Header-Datei einbinden
#include <iostream>

int main()
{
   // Daten definieren
   int ivar;
   short svar;
   // Daten einlesen
   std::cin >> ivar >> svar;
}

Eingabe von (alpha-)numerischen Daten

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

Standardmäßig werden numerischen Eingaben im Dezimalformat erwartet. Die Eingabe kann jedoch mit den Manipulatoren std::dec, std::hex und std::oct auf eine andere Zahlenbasis umgestellt werden. Die Manipulatoren werden ebenfalls mit dem Operator >> in den Ausgabestream eingefügt und die eingestellte Zahlenbasis bleibt solange gültig, bis sie umgestellt wird.

// Einlesen von Daten im Hex-Format und Ausgabe im Dezimalformat

#include <iostream>
#include <format>

int main()
{
   // Zwei einzulesende unsigned short Variablen definieren
   unsigned short var1, var2;
   // Zwei unsigned short Hex-Werte einlesen
   std::cout << "Bitte zwei 16-Bit Hex-Zahlen eingeben: ";
   std::cin >> std::hex >> var1 >> var2;
   // Und die Werte als Dezimalzahl ausgeben
   std::cout << std::format("var1: {}, var2: {}\n", var1, var2);
}

Der einfachste und sicherste Weg zum Einlesen von alphanumerischen Eingaben führt über das Einlesen in string-Objekte. Ein string-Objekt wird wie folgt definiert:

std::string myString;

Der Datentyp string ist in der Header-Datei <string> definiert, die entsprechend mittels #include einzubinden ist, und liegt ebenfalls im Namensraum std.

Da einzulesende Daten durch Leerzeichen getrennt werden, wird für jedes alphanumerische Datum ein eigenes string-Objekt benötigt. Soll eine Eingabe, die aus mehreren Wörtern oder Zahlen besteht, in einem string-Objekt abgelegt werden, muss das Einlesen zeilenweise erfolgen (siehe nächsten Abschnitt).

#include <iostream>

#include <format>
#include <string>

int main()
{
   // Zwei einzulesende string-Objekte definieren
   std::string word1, word2;
   // Zwei Woerter einlesen
   std::cout << "Bitte 2 Woerter eingeben: ";
   std::cin >> word1 >> word2;
   // Und wieder ausgeben
   std::cout << std::format("Wort1: {}, Wort2: {}\n", word1, word2);
}

Einlesen von Zeilen

Eingaben die Leerzeichen enthalten werden zeilenweise eingelesen. Dies erfolgt mittels der Bibliotheksfunktion std::getline(...):

std::getline (in, myString[, del]);

in ist der Eingabestream, aus dem die Daten gelesen werden (z.B. std::cin) und myString das string-Objekt, in dem die Eingabe abgelegt wird. Der letzte optionale Parameter del definiert das char-Zeichen, bis zu dem die Eingabe in das string-Objekt übernommen wird. Standardmäßig ist dies der Zeilenvorschub (RETURN).

#include <iostream>
#include <format>
#include <string>

int main()
{
   // string-Objekt fuer die einzulesende Zeile
   std::string line;
   // Text einlesen
   std::cout << "Geben Sie eine Zeile ein:\n";
   std::getline(std::cin, line);
   // und Text wieder ausgeben
   std::cout << std::format("Die Eingabe war:\n{}\n", line);
}

Fehlerfälle

Soll mittels cin ein numerischer Wert eingelesen werden und es wird stattdessen ein nicht-numerischer Ausdruck eingegeben, behält das einzulesende Datum seinen ursprünglichen Wert und die Eingabe verbleibt im Eingabepuffer. Dieser Fehlerfall kann abgefangen werden, indem nach dem Einlesen die Memberfunktion cin.fail() aufgerufen wird. Sie liefert true zurück, wenn die Eingabe fehlerhaft war.

Soll sichergestellt werden, dass nach jeder Eingabe der Eingabepuffer vollständig leer ist, kann der Eingabepuffer mittels der Memberfunktion cin.ignore() geleert werden.

#include <iostream>
#include <format>
#include <limits>

int main()
{
   // int-Variable definieren und einlesen
   int var;
   std::cout << "Bitte int-Datum eingeben: ";
   std::cin >> var;
   // Pruefen ob Eingabe fehlerhaft war
   if (std::cin.fail() == true)
   {
      std::cout << "Fehlerhafte Eingabe!\n";
      // Fehler zuruecksetzen und Eingaben verwerfen
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<int>::max(),'\n');
      // Programm beenden
      exit(1);
   }
   std::cout << std::format("Eingabe war: {}\n", var);
}