C++ Tutorial

 Standardausgabe

Ausgabestream cout

Für Ausgabe auf die Standardausgabe, dies ist in der Regel der Bildschirm, wird das Ausgabestream cout (console output) aus der C++-Standardbibliothek verwendet.

Damit der Compiler cout kennt, muss am Anfang des Programms eine Datei, die sogenannte include- oder Header-Datei, eingebunden werden. Für cout ist dies die Header-Datei <iostream>. Das Einbinden erfolgt mit der Anweisung

#include <iostream>

Die Ausgabe selbst erfolgt über cout wie folgt:

std::cout << ausgabe1 [ << ausgabe2 << ...];

Das Präfix std:: vor dem Ausgabestream cout teilt dem Compiler mit, dass der Ausgabestream im Namensraum std der Standardbibliothek definiert ist (Namensräume werden später noch beschrieben). Und ausgabex ist der auszugebende Text bzw. die auszugebenden Daten.

Mehrere Ausgaben werden durch entsprechende Wiederholungen des Operators << sowie des auszugebenden Textes bzw. Datums aneinandergehängt.

Ausgabe von Text und Daten

Direkte Ausgabe

Auszugebende Texte, auch als Strings bezeichnet, werden in Anführungszeichen eingeschlossen und einzelne Zeichen in Hochkomma.

// Header-Datei einbinden
#include <iostream>

int main()
{
   // Begruessung ausgeben
   std::cout << "Willkommen" << " bei C++" << '!';
}

Außer einem Text können mittels cout auch Daten ausgeben werden. Um ein Datum auszugeben, wird der Name des Datums ebenfalls mithilfe des Operators << an den Ausgabestream cout übergeben.

Da Daten aber erst auf der nächsten Seite behandelt werden, beschränken wir uns auf die (noch nicht näher erklärte) Definition eines Ganzzahl- und Gleitkommadatums.

// Header-Datei einbinden
#include <iostream>

int main()
{
   // Daten definieren, wird gleich noch erklaert
   int ivar = 10;
   double fvar = 1./3.;
   // Begruessung ausgeben
   std::cout << "Willkommen" << " bei C++" << '!';
   // Daten ausgeben
   std::cout << " ivar: " << ivar << ", fvar: " << fvar;
}

Für die Formatierung der Ausgabe stehen sogenannte Manipulatoren zur Verfügung. Da wir aber im weiteren Verlaufe des Tutorials nur noch die mit C++20 eingeführte Bibliotheksfunktion format() verwenden, soll an dieser Stelle nicht weiter darauf eingegangen werden. Eine Übersicht über die Manipulatoren finden Sie z.B. auf der Seite https://en.cppreference.com unter den Stichwort Input/output manipulators.

Ausgabe mittels format()

Da format() ebenfalls in der C++-Standardbibliothek definiert ist, muss das Präfix std:: vor dem Funktionsaufruf format() gestellt und die Header-Datei <format> eingebunden werden

Der Aufruf der format()-Funktion sieht wie folgt aus:

std::string res = format("data1 {}, data2 {}", data1,data2);

Im ersten Parameter erhält format() den in Anführungszeichen eingeschlossenen Formatierungsstring, der einen auszugebenden Text und/oder Platzhalter {} für die auszugebenden Daten enthält. Werden Daten ausgegeben, folgenden nach einem Komma die auszugebenden Daten datax, wobei mehrere Daten durch Komma getrennt aufgelistet werden.

Als Ergebnis liefert die Funktion einen std::string mit der formatierten Ausgabe, der dann mit std::cout ausgegeben werden kann.

Da vorherige Beispiel sieht bei Verwendung von format() wie folgt aus:

// Header-Datei einbinden
#include <iostream>
#include <format>

int main()
{
   // Daten definieren
   int ivar = 10;
   double fvar = 1./3.;
   // Begruessung ausgeben
   std::cout << std::format("Willkommen bei C++!");
   // Daten ausgeben
   std::cout << std::format(" ivar: {}, fvar: {}",ivar,fvar);
}

Die Formatierung von auszugebenden Daten erfolgt durch Formatanweisungen innerhalb des Platzhalters {}. Sie werden stets mit einem Doppelpunkt eingeleitet. Folgende Formatanweisungen stehen zur Verfügung:

:[[fill]align][sign][#][0][width][.precision][type]

Zunächst bestimmt width die minimale Stellenanzahl für die Ausgabe. Werden nicht alle Stellen benötigt, kann über fill/align die Ausrichtung der Ausgabe sowie das Füllzeichen für die nicht belegten Stellen definiert werden. Wird für align < angegeben, wird die Ausgabe linksbündig ausgerichtet, mit > rechtsbündig und mit ^ zentriert.

sign definiert, wann ein Vorzeichen ausgegeben wird. Wird für sign das Pluszeichen + angegeben, wird immer das Vorzeichen mit ausgegeben.

type bestimmt bei Integer-Daten das für die Ausgabe zu verwendende Zahlensystem. Standardmäßig werden die Daten als Dezimalzahl ausgegeben. Für die Ausgabe als Hex-Zahl ist für type der Buchstabe x, für die Ausgabe als Oktalzahl der Buchstabe o und für die Ausgabe als Binärzahl der Buchstabe b einzusetzen.

Bei der Ausgabe von Gleitkommadaten besitzt type eine abweichende Bedeutung. Wird für type der Buchstabe e angegeben, wird das Gleitkommadatum mit einem Exponenten ausgegeben und wird der Buchstabe f angegeben, erfolgt die Ausgabe als Festkommazahl.

Wird das Hash-Zeichen # angegeben, wird ein Präfix für das bei der Ausgabe verwendete Zahlensystem ausgegeben. Für Hex-Zahlen ist dies 0x, für Oktalzahlen 0 und für Binärzahlen 0b. Dezimalzahlen werden ohne Präfix ausgegeben.

Die Formatanweisung 0 bewirkt, das nicht belegte führende Stellen mit 0 aufgefüllt werden, wenn keine fill/align Formatanweisung spezifiziert ist.

Und .precision legt bei Gleitkommadaten die Anzahl der ausgebenden Nachkommastellen fest.

Die Sequenz \n im nachfolgenden Beispiel wird gleich noch beschrieben.

// Header-Datei einbinden
#include <iostream>
#include <format>

int main()
{
   std::cout << std::format("*{:5}*\n",10);
   std::cout << std::format("*{:~<5}*\n", 10);
   std::cout << std::format("*{:#08}*\n", 12);
   std::cout << std::format("*{:8.3}*\n", 1./3.);
   std::cout << std::format("233 = {:#b}\n",233);
   std::cout << std::format("233 = {:#x}\n",233);
}

Escape-Sequenzen

Für die Ausgabe von nicht-druckbaren Zeichen, wie z.B. ein Zeilenvorschub oder ein Tabulator, werden sogenannte Escape-Sequenzen verwendet. Escape-Sequenzen beginnen mit einem Backslash-Zeichen \, gefolgt von einem ASCII-Zeichen, das die auszuführende 'Operation' definiert. Eine Escape-Sequenz wird vom Compiler als ein Zeichen betrachtet.

Die wichtigsten Escape-Sequenzen sind \n für einen Zeilenvorschub und \t für einen Tabulator.

Soll in einem String ein Anführungszeichen ausgegeben werden, ist hierfür die Escape-Sequenz \" zu verwenden. Und um ein einzelnes Hochkomma auszugeben, ist folglich die Escape-Sequenz \' zu verwenden.

// Header-Datei einbinden
#include <iostream>
#include <format>

int main()
{
   // Daten definieren/initialisieren
   const float VAL = 110.23f;
   const char *pText= "einhundertzehn";
   // Daten ausgeben
   std::cout << std::format("Betrag: {:*>10.2f}\nin Worten: \"{}\"",
                             VAL, pText);
}

Wenden wir uns nun auf der nächsten Seite der Definition von Daten zu.