Wenn fertig, bitte Fenster schließen

Formatierungsflags

Die Steuerung der Ausgabeformatierung kann auch über sogenannte Flags (Flaggen, nehmen nur die Zustände gesetzt und nicht gesetzt an) eingestellt werden. Um eine bestimmte Formatierung der Ausgabe zu erreichen, wird das entsprechende Flag mit der Memberfunktion setf(...) des cout-Streams gesetzt. Entsprechend wird mittels unsetf(...) das Flag wieder zurückgesetzt. Die Funktion setf(...) liefert die bisherigen Zustände der Flags als long Wert zurück. Wenn die bisherigen Zustände nicht ausgewertet werden sollen, kann der Rückgabewert auch einfach ignoriert werden, so wie im Beispiel unten. Nachfolgend sind einige Beispiele für Formatierungen über Flags aufgeführt. 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.

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

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

// Das Programm
int main ()
{
   // Auszugebende Daten
   auto iVar = 20;
   auto 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 << "linksbuendig und Exponent:" << std::setprecision(2)
        << setw(13) << dblVar << ":\n";
}
Programmausgabe Zahlenbasis mit ausgeben:0x14 024
 linksbündig und Exponent:3.33e-001~~~~:

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

Bitte hier beachten, dass es zwei verschiedene Formen der Memberfunktionen setf(...) gibt. Bei den ersten beiden Aufrufen im Beispiel erhält die Memberfunktion ein Argument übergeben und bei den nachfolgenden Aufrufen zwei Argumente. Die Memberfunktion mit zwei Argumenten verändert nur die Flags, die auch im zweiten Argument enthalten sind, d.h. das zweite Argument ist eine Maske. Dabei werden zuerst alle im zweiten Argument angegebenen Flags zurückgesetzt und dann die Flags, die im ersten Argument spezifiziert sind, gesetzt. Es werden dabei aber auch wirklich nur die Flags gesetzt, die auch im zweiten Argument enthalten sind. Wenn Sie sich das Beispiel einmal genauer ansehen, 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 Argument nicht auftaucht. Dies liegt daran, dass ios::adjustfield ist eine Kombination aus den 3 Flags ios::left, ios::right und ios::internal ist.

Im obigen Beispiel 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 Argumente (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).