C++ Kurs

Wenn fertig, bitte Fenster schließen

Formatierungsflags

Die Steuerung der Ausgabeformatierung kann auch über so genannte Flags (Flaggen, nehmen nur die Zustände gesetzt und nicht gesetzt an) eingestellt werden. Um eine bestimmte Formatierung der Ausgabe zu erreichen, setzen Sie das entsprechende Flag mit der Memberfunktion setf(...) des cout-Streams. Entsprechend wird mittels unsetf(...) das Flag wieder zurückgesetzt. Beide Funktionen liefern die bisherigen Zustände der Flags als long Wert zurück. Wenn Sie die bisherigen Zustände nicht auswerten wollen, können Sie den Rückgabewert auch einfach ignorieren (so wie im Beispiel unten). Nachfolgend sehen Sie einige Beispiele für Formatierungen über Flags. Stören Sie sich im Augenblick nicht an der etwas seltsam wirkenden Schreibweise std::ios::xxx. xxx ist das zu beeinflussende Flag und ios:: gibt die Klasse an, zu der das Flag gehört (welche wiederum im Namensraum std liegt). Mehr zu Klassen und dem Operator :: später im Kurs.


// IO-Stream Datei und Manipulatoren einbinden
#include <iostream>
#include <iomanip>

using std::cout;
using std::setw;

// Das Programm
int main ()
{
   // Auszugebende Daten
   int iVar = 20;
   double dblVar = 1./3.;

   // Ausgabe mit Zahlenbasis
   cout.setf(std::ios::showbase);
   cout << "Zahlenbasis mit ausgeben:" << std::hex << setw(4)
        << iVar << std::oct << setw(4) << iVar << '\n';

   // Zahlenbasis unterdrücken
   cout.unsetf(std::ios::showbase);

   // Ausgabe linksbündig mit Exponenten
   cout.setf(std::ios::left, std::ios::adjustfield);
   cout.setf(std::ios::scientific, std::ios::floatfield);
   cout << "linksbündig und Exponent:" << std::setprecision(2)
        << setw(13) << dblVar << ":\n";
}

Zahlenbasis mit ausgeben:0x14 024
linksbündig und Exponent:3.33e-001~~~~:

Hinweis: Das Zeichen ~ steht hier für ein Leerzeichen

Beachten Sie auch, dass es zwei verschiedene Memberfunktionen setf(...) gibt. Bei den ersten beiden Aufrufen im Beispiel erhält die Memberfunktion einen Parameter übergeben und bei den nachfolgenden Aufrufen zwei Parameter. Die Memberfunktion mit zwei Parametern verändert nur die Flags, die im zweiten Parameter angegeben sind, d.h. der zweite Parameter ist eine Art Maske. Dabei werden zuerst alle im zweiten Parameters angegebenen Flags zurückgesetzt und dann die Flags, die im ersten Parameter spezifiziert sind, gesetzt. Beachten Sie aber bitte, dass auch wirklich nur die Flags gesetzt werden, die auch im zweiten Parameter enthalten sind. Wenn Sie sich das Beispiel einmal genauer ansehen haben, wundern Sie sich nun vielleicht, dass z.B. beim Aufruf der Memberfunktion setf(std::ios::left, std::ios::adjustfield) das Flag ios::left im zweiten Parameter nicht auftaucht. Dies liegt daran, dass ios::adjustfield ist eine Kombination aus den 3 Flags ios::left, ios::right und ios::internal ist.

Beachten Sie im obigen Programm auch die Angaben des Namensraums std. Hier wird sowohl die using-Form als auch die std::-Form verwendet. Dies soll nur nochmals verdeutlichen, dass Sie beide Formen parallel benutzen können und soll nicht unbedingt als Vorgabe für einen sauberen Programmierstil dienen!

Die nachfolgende Tabelle enthält wie wichtigsten Parameter (Flags) der Memberfunktion setf bzw. unsetf

Flag Formatierung
uppercase Großbuchstaben für Hexzahlen und den Exponenten
showbase Präfix für aktuelle Zahlenbasis anzeigen (0x für hex, 0 für Oktal
showpoint Erzwingt die Ausgabe des Dezimalpunkts und event. 0 bei Gleitkommazahlen
showpos Ausgabe des Vorzeichens auch bei positiven Zahlen
skipws Überliest bei Eingabe white-space Zeichen (Leerzeichen, Tabulator, Zeilenvorschub
boolalpha Gibt bei bool-Variablen true bzw. false anstelle von 1 bzw. 0 aus
unitbuf Leert den Ausgabepuffer nach jeder Ausgabe
left, adjustfield Ausgabe linksbündig
right, adjustfield Ausgabe rechtsbündig
internal, adjustfield Raum zwischen Vorzeichen und Zahl wird mit Leerzeichen ausgefüllt
scientific, floatfield Ausgabe mit Exponenten (beeinflusst auch die Wirkung von setprecision)
fixed, floatfield Ausgabe ohne Exponenten (beeinflusst auch die Wirkung von setprecision)
dec, basefield Ausgabe als Dezimalzahl
hex, basefield Ausgabe als Hexadezimalzahl
oct, basefield Ausgabe als Oktalzahl

Auf die Angabe des Namensraums wurde in der Tabelle der Übersicht wegen verzichtet. Ein vollständiger Aufruf von setf für eine linksbündige Ausgabe würde wie folgt aussehen: std::cout.setf(std::ios::left, std::ios::adjustfield).