Wenn fertig, bitte Fenster schließen
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 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).