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