Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

manip iostream-Manipulation

&pagelevel(3)&pagelevel


In diesem Abschnitt wird die Verwendung von Manipulatoren in Verbindung mit iostream-Objekten beschrieben.


#include <iostream.h>
#include <iomanip.h>

IOMANIPdeclare(T);

class SMANIP(T)
{
public:

SMANIP(T)(ios& (*)(ios&,T), T);
friend istream& operator>>(istream&, const SMANIP(T)&);
friend ostream& operator<<(ostream&, const SMANIP(T)&);

};

class SAPP(T)
{
public:

SAPP(T)(ios& (*)(ios&,T));
SMANIP(T) operator()(T);

};

class IMANIP(T)
{
public:

IMANIP(T)(istream& (*)(istream&,T),T);
friend istream& operator>>(istream&, const IMANIP(T)&);

};

class IAPP(T)
{
public:

IAPP(T)(istream& (*)(istream&,T));
IMANIP(T) operator()(T);

};

class OMANIP(T)
{
public:

OMANIP(T)(ostream& (*)(ostream&,T),T);
friend ostream& operator<<(ostream&, const OMANIP(T)&);

};

class OAPP(T)
{
public:

OAPP(T)(ostream& (*)(ostream&,T));
OMANIP(T) operator()(T);

};

class IOMANIP(T)
{
public:

IOMANIP(T)(iostream& (*)(iostream&,T),T);
friend istream& operator>>(iostream&, const IOMANIP(T)&);
friend ostream& operator<<(iostream&, const IOMANIP(T)&);

};

class IOAPP(T)
{
public:

IOAPP(T)(iostream& (*)(iostream&,T));
IOMANIP(T) operator()(T);

};

IOMANIPdeclare(int);
IOMANIPdeclare(long);

SMANIP(int)   setbase(int);
SMANIP(long)  resetiosflags(long);
SMANIP(int)   setfill(int);
SMANIP(long)  setiosflags(long);
SMANIP(int)   setprecision(int);
SMANIP(int)   setw(int w);



Manipulatoren sind Werte, die in Datenströme eingefügt oder daraus entnommen werden können, um einen bestimmten Effekt (nicht nur den des Einfügens oder Extrahierens von Werten) zu erzielen. Zu diesem Zweck ist eine komfortable Syntax verfügbar.Manipulatoren ermöglichen es, einen Funktionsaufruf in einen Ausdruck einzubetten, der mehrere Einfügungen oder Extraktionen umfasst. Der vordefinierte Manipulator flush für ostream-Objekte kann beispielsweise wie folgt eingesetzt werden, um cout zu leeren:

cout << flush

Einige iostream-Klassen stellen Manipulatoren bereit (siehe ios, istream und ostream). flush ist ein recht einfacher Manipulator. Einige Manipulatoren übernehmen Argumente (wie die vordefinierten ios-Manipulatoren setfill und setw, die weiter unten beschrieben werden). Die Include-Datei <iomanip.h> stellt Makrodefinitionen zur Verfügung, die der Programmierer für die Definition neuer parametrisierter Manipulatoren verwenden kann.

Im Idealfall werden die mit Manipulatoren verknüpften Typen als "Schablonen" parametrisiert. Die in <iomanip.h> definierten Makros simulieren Schablonen. IOMANIPdeclare(T) deklariert die verschiedenen Klassen und Operatoren. (Der gesamte Code wird in Inline-Form deklariert, so dass keine eigenständigen Definitionen erforderlich sind.) Jeder der anderen Typnamen wird zur Konstruktion von Namen verwendet und muß daher ein einzelner Bezeichner sein. Jedes der anderen Makros erfordert ebenfalls einen Bezeichner und wird zu einem Namen erweitert.

Für die folgenden Beschreibungen wird angenommen, dass

  • t ein Typname (T) ist.
  • s ein ios-Objekt ist.
  • i ein istream-Objekt ist.
  • o ein ostream-Objekt ist.
  • io ein iostream-Objekt ist.
  • f vom Typ ios& (*)(ios&, T) ist.
  • isf vom Typ istream& (*)(istream&, T) ist.
  • osf vom Typ ostream& (*)(ostream&, T) ist.
  • iof vom Typ iostream& (*)(iostream&, T) ist.
  • n ein int-Wert ist.
  • l ein long-Wert ist.

s<<SMANIP(T)( (ios& (*)(ios&, T)) f, T t)
s>>SMANIP(T)( (ios& (*)(ios&, T)) f, T t)
s<<SAPP(T)( (ios& (*)(ios&, T)) f)(T t)
s>>SAPP(T)( (ios& (*)(ios&, T)) f)(T t)

Es wird f(s,t) geliefert, wobei s der linke Operand des Einfüge- oder Extraktoroperators (z.B. s, i, o oder io) ist.

i>>IMANIP(T)( (istream& (*)(istream&, T)) isf, T t)
i>>IAPP(T)( (istream& (*)(istream&, T)) isf) (T t)

Es wird isf(i,t) geliefert.

o<<OMANIP(T)( (ostream& (*)(ostream&, T)) osf,T t)
o<<OAPP(T)( (ostream& (*)(ostream&, T)) osf) (T t)

osf(o,t) wird geliefert.

io<<IOMANIP(T)( (iostream& (*)(iostream&, T)) iof,T t)
io>>IOMANIP(T)( (iostream& (*)(iostream&, T)) iof,T t)
io<<IOAPP(T)( (iostream& (*)(iostream&, T)) iof) (T t)
io>>IOAPP(T)( (iostream& (*)(iostream&, T)) iof) (T t)

iof(io,t) wird geliefert.

<iomanip.h> enthält zusätzlich einige Manipulatoren, die ein int- oder long-Argument übernehmen. Diese Manipulatoren beschäftigen sich mit der Veränderung des Formatstatus eines Datenstroms; weitere Informationen finden Sie bei ios.

o<<setbase(int n)
i>>setbase(int n)

Das Konvertierungsbasisflag wird auf n gesetzt.

o<<resetiosflags(long l)
i>>resetiosflags(long l)

Die durch l spezifizierten Formatbit werden im Datenstrom (o oder i) gelöscht (hierdurch wird o.setf(0, l) oder i.setf(0, l) aufgerufen).

o<<setfill(int n)
i>>setfill(int n)

Setzt die Füllzeichen des Datenstroms (o oder i) auf n.

o<<setiosflags(long l)
i>>setiosflags(long l)

Die durch l markierten Formatflags werden im Datenstrom (o oder i) gesetzt (dies führt zu einem Aufruf von o.setf(l) oder i.setf(l)).

o<<setprecision(int n)
i>>setprecision(int n)

Die Genauigkeit des Datenstroms (o oder i) wird auf n gesetzt.

o<<setw(int n)
i>>setw(int n)

Die Feldbreite eines Datenstroms (linksseitiger Operand: o oder i) wird auf n gesetzt.

BEISPIEL

Das folgende Programm veranschaulicht die Verwendung von Manipulatoren (wie setw), die eine Ausgabe global ändern, indem private-Datenelemente in cout modifiziert werden:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
void testline(const char * const p)
{
  /* Parameterzeichenkette in cout einfügen und Feldbreite von      */
  /* cout auf die doppelte Länge der Zeichenkette setzen            */
  int N = 2 * strlen(p);
  cout << setw(N) ;
  cout << p;
}
void someoutput(const char * const p, const char * const q)
{
  /* Gegeben sind eine Zeichenkette p und eine Zeichenkette q, die  */
  /* eine Liste der Füllzeichen enthält; die Zeichenkette p soll    */
  /* in verschiedenen Füllzeichen-Kontexten angezeigt werden        */
  int i;
  int M = strlen(q);
  for (i = 0; i < M; ++i)
  {
    cout << setfill(q[i]);
    testline(p);
  }
}
int main()
{
  someoutput( "Eine Testzeichenkette\n", ".,!$%&*()");
  /* Beachten Sie, daß die Ausgabe von Zeichenkette rechtsbündig    */
  /* erfolgt */
  return 0;
}

<string.h> muss zur Bereitstellung des Funktionsprototyps von strlen() und <iomanip.h> muss zur Bereitstellung der Prototypen von setw() und setfill() eingebunden werden.

Das Ergebnis der Programmausführung ist:

.....................Eine Testzeichenkette
,,,,,,,,,,,,,,,,,,,,,Eine Testzeichenkette
!!!!!!!!!!!!!!!!!!!!!Eine Testzeichenkette
$$$$$$$$$$$$$$$$$$$$$Eine Testzeichenkette
%%%%%%%%%%%%%%%%%%%%%Eine Testzeichenkette
&&&&&&&&&&&&&&&&&&&&&Eine Testzeichenkette
*********************Eine Testzeichenkette
(((((((((((((((((((((Eine Testzeichenkette
)))))))))))))))))))))Eine Testzeichenkette
%  CCM0998 Verbrauchte CPU-Zeit: 0.0006 Sekunden

SIEHE AUCH


 ios, istream, ostream