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)