Streams (2) - Manipulatoren
Martin Kompf
Um die Ein- und Ausgabe nach eigenen Wünschen gestalten zu können, hat der C++ Entwickler die Möglichkeit, den Datenstrom durch Manipulatoren zu steuern.
In der Einführung zum Thema »Streams« wurde die Ein- und Ausgabe verschiedener Daten im C++ Programm vorgestellt. Dabei ist der Anwender auf die Standardformatierungen der iostream Library angewiesen. Problematisch kann dies dann werden, wenn es bestimmte Wünsche hinsichtlich der Gestaltung der Ausgabe gibt. Will der Programmierer zum Beispiel eine Tabelle mit dem großen Einmaleins ausgeben, so ist es wünschenswert, dass die Zahlen in den Spalten rechtsbündig untereinander stehen und sich Leerzeichen zwischen den Zahlen befinden. Diese Ausgabeformatierung lässt sich mittels besonderer Stream-Manipulatoren erreichen. Die Manipulatoren werden wie normale Ausgabefelder in den Ein- oder Ausgabestrom eingefügt. Das Beispiel kann dann folgendermaßen realisiert werden:
#include <iostream>
#include <iomanip>
using namespace std;
for (int i = 1; i < 20; ++i) {
for (int j = 1; j < 20; ++j) {
cout << right << setw(4) << i*j;
}
cout << endl;
}
Hierbei sorgt der Manipulator right für eine rechtsbündige Ausrichtung der Ausgabe, die wegen setw(4) immer vier Zeichen breit ist. Schließlich bewirkt endl die Ausgabe einer Zeilenumschaltung.
Ein anderes Problem bei der Ausgabe numerischer Werte ist die Darstellung mit einer bestimmten Genauigkeit. Das nächste Beispiel zeigt, wie mittels Verwendung des Manipulators setprecision die Kreiszahl pi mit unterschiedlicher Genauigkeit ausgegeben werden kann. Dabei wird die Ausgabe korrekt gerundet:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double pi = 4.0 * atan(1.0);
for (int p = 12; p > 1; --p) {
cout << setprecision(p) << fixed << pi << endl;
}
Die nachfolgende Übersicht kann als Kurzreferenz für die in der iostream Library definierten Manipulatoren verwendet werden.
Standard Manipulatoren aus <iostream>
- boolalpha
- Objekte vom Typ bool werden als Text ("true" oder "false") und nicht als numerischer Wert ausgegeben.
- noboolalpha
- Objekte vom Typ bool werden als numerischer Wert (0 oder 1) ausgegeben.
- showbase
- Bei Ausgabe wird das hex Format mit vorangestelltem "0x" und das oct Format mit "0" gekennzeichnet.
- noshowbase
- Die Ausgabe im hex oder oct Format wird nicht besonders gekennzeichnet..
- showpoint
- Bei floating point Werten wird immer der Dezimalpunkt eingefügt.
- noshowpoint
- Bei floating point Werten wird nur falls erforderlich ein Dezimalpunkt eingefügt.
- showpos
- Numerischen nicht-negativen Feldern wird ein Pluszeichen vorangestellt.
- noshowpos
- Pluszeichen bei nicht-negativen Feldern werden unterdrückt.
- skipws
- Bei der Eingabe werden führende Whitespaces übergangen.
- noskipws
- Bei der Eingabe werden führende Whitespaces berücksichtigt.
- unitbuf
- Die Ausgabe wird nach jedem Element geschrieben (keine Pufferung).
- nounitbuf
- Die Ausgabe wird möglicherweise gepuffert.
- uppercase
- Bei der Verwendung von hex werden Großbuchstaben ausgegeben.
- nouppercase
- Bei der Verwendung von hex werden Kleinbuchstaben ausgegeben.
- left
- Felder werden linksbündig ausgerichtet und am Ende mit Füllzeichen aufgefüllt.
- right
- Felder werden rechtsbündig ausgerichtet und am Anfang mit Füllzeichen aufgefüllt.
- internal
- Füllzeichen werden zwischen dem Vorzeichen und dem Wert eingefügt.
- dec
- Integer Werte werden im Dezimalformat ein- oder ausgegeben.
- hex
- Integer Werte werden im Hexadezimalformat ein- oder ausgegeben.
- oct
- Integer Werte werden im Oktalformat ein- oder ausgegeben.
- fixed
- Floating point Werte werden im Fixkommaformat ausgegeben.
- scientific
- Floating point Werte werden im wissenschaftlichen Format (mit Exponent) ausgegeben.
- endl
- '\n' wird ausgegeben und der Ausgabepuffer geleert.
- ends
- '\0' wird ausgegeben und der Ausgabepuffer geleert.
- flush
- Der Ausgabepuffer wird geleert.
- ws
- Whitespaces werden aus der Eingabe entfernt.
Standardeinstellung: noboolalpha noshowbase noshowpoint noshowpos skipws nounitbuf nouppercase dec
Manipulatoren, die einen Parameter erfordern
Das zusätzliche Inkludieren von <iomanip> ist erforderlich!
- setbase(int base)
- Setzt die Zahlenbasis bei Ein- und Ausgabe (mögliche Werte: 8, 10, 16).
- setfill(Elem ch)
- Setzt das Füllzeichen.
- setprecision(streamsize prec)
- Setzt die Anzahl der Dezimalstellen nach dem Komma in den Formaten fixed und scientific oder die Gesamtanzahl der Dezimalstellen falls weder fixed noch scientific eingestellt sind.
- setw(streamsize wide)
- Setzt die Breite der Ausgabefelder. Ist der auszugebende Wert kürzer, wird entsprechend dem verwendeten Manipulator left, internal oder right ausgerichtet und mit dem Füllzeichen setfill(ch) aufgefüllt.
Standardeinstellung: setfill(' ') setprecision(6) setwidth(0)
Weitere interessante Artikel
Links zum Thema