C++-Programmierung/ Einführung in C++/ Einfache Ein- und Ausgabe

Aus Wikibooks
Zur Navigation springen Zur Suche springen


Ein- und Ausgaberoutinen geben Ihnen die Möglichkeit, mit einem Programm zu interagieren. Dieses Kapitel beschäftigt sich mit der Eingabe über die Tastatur und der Ausgabe auf der Konsole in C++-typischer Form. Die C-Variante werden Sie später noch kennenlernen.

Um die C++-Ein- und Ausgabe nutzen zu können, müssen Sie die Bibliothek iostream einbinden. Das geschieht mit:

Nuvola-inspired-terminal.svg
1 #include <iostream>

Danach müssen die Befehle daraus bekanntgegeben werden, da sie sich in einem Namensraum (engl. namespace) befinden. Was Namensräume sind und wofür man sie einsetzt, werden Sie später noch erfahren. Um nun die Ein- und Ausgabebefehle nutzen zu können, müssen Sie dem Compiler sagen: Benutze den Namensraum std. Dafür gibt es zwei Möglichkeiten: Sie können die folgende Zeile verwenden, um alle Namen aus dem Namensraum std verfügbar zu machen:

Nuvola-inspired-terminal.svg
1 using namespace std;

Oder Sie können den Namensraum „std“ immer direkt angeben. Er enthält alle Komponenten der Standardbibliothek von C++. In den Programmen dieses Buches wird der Namensraum immer direkt angegeben. Das heißt, wenn beispielsweise ein Objekt benutzt werden soll, das im Namensraum „std“ liegt, wird ihm „std::“ vorangestellt. Die beiden Doppelpunkte heißen Bereichsoperator.

Die Variante mit using namespace sollte üblicherweise nur innerhalb von Funktionen genutzt werden, da bei Verwendung im globalen Namensraum das ganze Konzept der Namensräume obsolet wird. In gedruckten Büchern wird es gern global verwendet, da dies etwas Platz spart und der in solchen Büchern knapp ist. Lassen Sie sich davon nicht beirren, es ist schlechter Stil.

Einfache Ausgabe[Bearbeiten]

Nun wollen wir aber endlich auch mal was Praktisches tun. Zugegebenermaßen nichts Weltbewegendes und im Grunde nicht einmal etwas wirklich Neues, denn Text haben wir ja schon im „Hello-World“-Programm ausgegeben.

Nuvola-inspired-terminal.svg
1 #include <iostream>
2 
3 int main(){
4     std::cout << "Dieser Text steht nun in der Kommandozeile!";
5     std::cout << "Dieser Text schließt sich direkt an..";
6     std::cout << '.';
7 }
Crystal Clear app kscreensaver.svg
Ausgabe:
1 Dieser Text steht nun in der Kommandozeile!Dieser Text schließt sich direkt an...

Wie der Text bereits selbst sagte, erscheint er in der Kommandozeile und der zweite schließt sich ohne Unterbrechung an. Der letzte von den drei abschließenden Punkten steht in einer zusätzlichen Zeile, um Ihnen zu demonstrieren, dass man einzelne Zeichen nicht in Anführungszeichen sondern in Apostrophe setzt. Das gilt aber nur für einzelne Zeichen, ab zwei Zeichen ist es schon eine Zeichenkette und dann verwendet man normale Anführungszeichen.

Wenn Sie innerhalb einer Zeichenkette einen Zeilenumbruch einfügen möchten, gibt es zwei Möglichkeiten. Sie können die Escape-Sequenz \n in die Zeichenkette einfügen oder den Manipulator endl (für end-line) benutzen. Was genau Escape-Sequenzen oder Manipulatoren sind, ist Thema eines späteren Kapitels, aber folgendes Beispiel demonstriert schon mal die Verwendung für den Zeilenumbruch:

Nuvola-inspired-terminal.svg
 1 #include <iostream>
 2 
 3 int main(){
 4     std::cout << "Text in der Kommandozeile!\n";                 // Escape-Sequenz \n
 5     std::cout << "Dieser Text schließt sich an...\n";            // Das steht in einer eigenen Zeile
 6 
 7     std::cout << std::endl;                                      // Leerzeile mittels endl
 8 
 9     std::cout << "Text in der Kommandozeile!" << std::endl;      // Zeilenumbruch mit endl
10     std::cout << "Dieser Text schließt sich an..." << std::endl; // Das steht in einer eigenen Zeile
11 }
Crystal Clear app kscreensaver.svg
Ausgabe:
1 Text in der Kommandozeile!
2 Dieser Text schließt sich an...
3 
4 Text in der Kommandozeile!
5 Dieser Text schließt sich an...

Beide Methoden haben scheinbar den gleichen Effekt. Verwenden Sie die Escape-Sequence Methode mit "\n". std::endl ist langsamer, da es nicht nur einen Zeilenumbruch ausgibt, sondern auch den Ausgabepuffer leert. Dies wird später noch genauer erläutert.

Einfache Eingabe[Bearbeiten]

Für die Eingabe muss ein wenig vorgegriffen werden, denn um etwas einzulesen, ist etwas nötig, worin das Eingelesene gespeichert werden kann. Dieser „Behälter“ nennt sich Variable. Eine Variable muss zunächst einmal angelegt werden. Am besten lässt sich die Eingabe an einem Beispiel erklären:

Nuvola-inspired-terminal.svg
 1 #include <iostream>
 2 
 3 int main(){
 4     int integer;
 5 
 6     std::cout << "Benutzereingabe: ";
 7 
 8     std::cin >> integer;
 9 
10     std::cout << "Sie haben " << integer << " eingegeben.";
11 }
Crystal Clear app kscreensaver.svg
Ausgabe:
1 Benutzereingabe: 643
2 Sie haben 643 eingegeben.

Es wird, wie bereits erwähnt, erst eine Variable angelegt (int integer;), welcher dann ein Wert zugewiesen wird (cin >> integer;). Diese zweite Zeile bedeutet so viel wie: Lies eine ganze Zahl von der Tastatur und speichere sie in der Variablen integer.

cin (gesprochen c-in) ist sozusagen die Tastatur, integer ist die Variable und >> bedeutet so viel wie „nach“. Zusammen ergibt sich „Tastatur nach Variable“, es wird also der „Inhalt“ der Tastatur in die Variable integer verschoben. Dass eine Ganzzahl von der Tastatur gelesen wird, ist übrigens vom Datentyp der Variablen abhängig, aber dazu später mehr.

Um den Inhalt der Variablen wieder auszugeben, müssen Sie nichts weiter tun, als sie mit einem weiteren Schiebeoperator (<<) hinter cout (gesprochen c-out) anzuhängen. Es ist ohne Weiteres möglich, mehrere solcher Schiebeoperatoren hintereinander zu schalten, solange Sie nur die letzte Ein- oder Ausgabe mit einem Semikolon (;) abschließen. Bei der Eingabe muss natürlich der >>-Operator statt dem <<-Operator benutzt werden. Die Reihenfolge der Ein- oder Ausgabe bei solchen Konstruktionen entspricht der eingegebenen Folge im Quelltext. Was zuerst hinter cout oder cin steht, wird also auch zuerst ausgeführt.

Crystal source cpp.png

Im Anhang zu diesem Kapitel finden Sie:

  • Fragen und die dazugehörigen Antworten.
Fragen
Symbol question.svg Frage 1: Was ist hier verkehrt?
Crystal Clear action button cancel.svg
1 int integer;
2 std::cin << integer;

Der Operator muss >> sein.

Symbol question.svg Frage 2: Funktioniert folgendes Beispiel?
Nuvola-inspired-terminal.svg
 1 #include <iostream>
 2 
 3 int main(){
 4     int integer;
 5 
 6     std::cin >> integer;
 7 
 8     std::cout << "Sie haben "
 9               << integer
10               << " eingegeben.";
11 }

Das Beispiel funktioniert hervorragend. Zeilenumbrüche sind kein Problem, solange sie nicht innerhalb einer Zeichenkette stehen. Wenn Sie allerdings beabsichtigen, einen Zeilenumbruch bei der Ausgabe zu erzeugen, müssen Sie \n oder endl benutzen.