Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

ostream Formatierte und unformatierte Ausgabe

&pagelevel(3)&pagelevel


In diesem Abschnitt werden die ostream-Funktionen zur formatierten und unformatierten Ausgabe beschrieben.


#include <iostream.h>

typedef long streamoff, streampos;

class ios
{
public:

enum seek_dir {beg, cur, end};
enum open_mode {in, out, ate, app, trunc, nocreate, noreplace,

bin, tabexp};

enum

{

skipws=01,
left=02, right=04, internal=010,
dec=020, oct=040, hex=0100,
showbase=0200, showpoint=0400,
uppercase=01000, showpos=02000,
scientific=04000, fixed=010000,
unitbuf=020000, stdio=040000

};

// siehe ios ; dort werden weitere Klassenelemente beschrieben

} ;

class ostream : virtual public ios

{

public:


ostream(streambuf*);

virtual

ostream&
int
void
ostream&
ostream&
ostream&
streampos
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&
ostream&

˜ostream();

flush();
opfx();
osfx();
put(char);
seekp(streampos);
seekp(streamoff, ios::seek_dir);
tellp();
write(const char* ptr, int n);
write(const unsigned char* ptr, int n);
operator<<(const char*);
operator<<(char);
operator<<(short);
operator<<(int);
operator<<(long);
operator<<(float);
operator<<(double);
operator<<(unsigned char);
operator<<(unsigned short);
operator<<(unsigned int);
operator<<(unsigned long);
operator<<(void*);
operator<<(streambuf*);
operator<<(ostream& (*)(ostream&));
operator<<(ios& (*)(ios&));

};

class ostream_withassign : public ostream

{

public:


ostream_withassign();

virtual

˜ostream_withassign();

ostream_withassign&
ostream_withassign&

operator=(ostream&);
operator=(streambuf*);

};

extern ostream_withassign cout;
extern ostream_withassign cerr;
extern ostream_withassign clog;

ostream&
ostream&
ostream&
ios&
ios&
ios&

endl(ostream&);
ends(ostream&);
flush(ostream&);
dec(ios&);
hex(ios&);
oct(ios&);



ostream-Objekte unterstützen das Einfügen (Speichern) in einem streambuf-Objekt. Man spricht in diesem Zusammenhang auch von Ausgabeoperationen. Die ostream-Elementfunktionen und die damit verknüpften Funktionen werden nachstehend beschrieben.

Bei den anschließenden Erläuterungen wird vorausgesetzt, dass

  • outs ein ostream-Objekt ist.
  • outswa ein ostream_withassign-Objekt ist.
  • outsp vom Typ ostream* ist.
  • c vom Typ char ist.
  • ptr vom Typ char* oder unsigned char*ist.
  • sb vom Typ streambuf* ist.
  • i und n int-Werte sind.
  • pos vom Typ streampos ist.
  • off vom Typ streamoff ist.
  • dir vom Typ seek_dir ist.
  • manip eine Funktion vom Typ ostream& (*) (ostream&) ist.

Konstruktoren und Zuweisung

ostream(streambuf * sb)

Die ios- und ostream-Statusvariablen werden initialisiert und der Puffer sb mit dem ostream-Objekt verknüpft.

ostream_withassign()

Es wird keine Initialisierung vorgenommen. Hierdurch kann eine static-Variable dieses Typs (z.B. cout) vor ihrer Konstruktion eingesetzt werden. Dabei wird vorausgesetzt, dass der Variable zuvor ein Wert zugewiesen wurde.

outswa=sb

sb wird mit outswa verknüpft und die gesamte Statusangabe von outswa initialisiert.

outswa=outs

outs.rdbuf() wird mit outswa verknüpft und die gesamte Statusangabe von outswa initialisiert.

Ausgabepräfixfunktion

int outs.opfx()

Wenn der Fehlerstatus von outs ungleich 0 ist, wird direkt der Wert 0 zurückgegeben.Wenn outs.tie() einen Wert ungleich 0 liefert, werden die Puffer der mit outs verknüpften ios-Objekte geleert. In allen anderen Fällen wird ein Wert ungleich 0 geliefert.

Ausgabesuffixfunktion

void osfx()

Vor dem Rücksprung von der Inserter-Abarbeitung werden "Suffix"-Aktionen ausgeführt. Wenn ios::unitbuf gesetzt ist, leert die Funktion osfx() das ostream-Objekt. Beigesetztem ios::stdio leert die Funktion osfx() sowohl stdout als auch stderr. Im BS2000 bedeutet das Leeren (flush) von stdio und stderr unter anderem, dass die aktuelle Zeile (Satz) beendet wird. Die nächste Ausgabe erfolgt in die nächste Zeile.

osfx() wird von allen vordefinierten Insertern aufgerufen und sollte auch von benutzerdefinierten Insertern nach der direkten Manipulation von streambuf-Objekten eingesetzt werden. Binäre Ausgabefunktionen rufen osfx() nicht auf.

Funktionen für die formatierte Ausgabe (Inserter)

outs<<x

Es wird zunächst outs.opfx() aufgerufen; wenn diese Funktion den Wert 0 liefert, wird keine weitere Operation ausgeführt. Im anderen Fall wird eine Zeichenfolge, die x darstellt, in outs.rdbuf() eingefügt. Fehler werden durch Setzen des Fehlerstatus von outs angezeigt. Es wird immer outs zurückgegeben.
x wird in eine Folge von Zeichen (deren Darstellung oder Repräsentation) umgewandelt. Die hierbei geltenden Regeln sind vom Typ von x und den Formatstatusflags und Variablen in outs abhängig (siehe ios ). Inserter werden für die folgenden Datentypen (mit den angegebenen Umwandlungsregeln) definiert:

char*

Die Repräsentation ist eine Folge von Zeichen bis zu (aber nicht einschließlich) der beendenden 0 der Zeichenkette, auf die x gerichtet ist.

alle Ganzzahltypen
(außer char und unsigned char)

  • Wenn x positiv ist, enthält die Repräsentation eine Folge von dezimalen, oktalen oder hexadezimalen Ziffern ohne führende Nullen. Welche Notation verwendet wird, hängt von den gesetzten Formatflags in ios (ios::dec, ios::oct oder ios::hex) ab. Wenn keines der Flags gesetzt ist, wird standardmäßig die Dezimalnotation verwendet.
  • Wenn x gleich 0 ist, besteht die Repräsentation aus einem einzelnen Nullzeichen(0).
  • Wenn x negativ ist, führt die Dezimalumwandlung zu einer Darstellung, bei der vor den dezimalen Stellen ein Minuszeichen (-) erscheint.
  • Wenn x positiv und ios::showpos gesetzt ist, führt die dezimale Umwandlung zur Anzeige eines Pluszeichens (+), dem dezimale Stellen folgen. Die anderen Umwandlungen behandeln alle Werte als vorzeichenlos. Wenn ios::showbase in den Formatflags von ios gesetzt ist, enthält die hexadezimale Repräsentation vor den hexadezimalen Stellen die Zeichenfolge 0x oder 0X (letzteres bei gesetztem ios::uppercase). Bei gesetztem ios::showbase beginnt die oktale Darstellung mit einer führenden 0.

void*

Zeiger werden in Ganzzahlwerte und anschließend in hexadezimale Werte umgewandelt, so als ob ios::showbase gesetzt wäre.

float, double

Die Argumente werden entsprechend den aktuellen Werten von outs.precision(), outs.width() und den Formatflags ios::scientific, ios::fixed und ios::uppercase (siehe ios ) von out umgewandelt. Der Standardwert für outs.precision() ist 6. Wenn weder ios::scientific noch ios::fixed gesetzt sind, wird für die Darstellung die Festpunktnotation oder die wissenschaftliche Notation in Abhängigkeit vom Wert x gewählt.

char, unsigned char

Es ist keine spezielle Umwandlung notwendig.

Nachdem die Darstellung bestimmt ist, wird das Auffüllen behandelt. Wenn outs.width() größer als 0 ist und die Repräsentation weniger als outs.width() Zeichen umfaßt, werden genügend outs.fill()-Zeichen hinzugefügt, um die Gesamtzahl derZeichen auf ios.width() aufzufüllen. Wenn ios::left in den Formatflags von ios gesetzt ist, wird die Zeichenfolge linksbündig ausgerichtet, und die Füllzeichen werden am Ende der Zeichenkette angehängt. Bei gesetztem ios::right werden die notwendigenFüllzeichen vor der Zeichenfolge eingefügt. Ist ios::internal gesetzt, erfolgt das Auffüllen zwar hinter einem vorangestellten Vorzeichen oder einer Basisindikation, aber noch vor den Zeichen, die den Wert darstellen. ios.width() wird auf 0 zurückgesetzt,während alle anderen Formatvariablen unverändert bleiben. Die resultierende Folge (Füllzeichen plus Wertrepräsentation) wird in outs.rdbuf() eingefügt.

outs<<sb

Wenn outs.opfx() einen Wert ungleich 0 liefert, wird eine Zeichenfolge in outs.rdbuf()eingefügt, die aus sb entnommen werden kann. Die Einfügung wird abgebrochen,wenn in sb keine weiteren Zeichen zur Verfügung stehen. Das Auffüllen unterbleibt,und es wird immer outs zurückgegeben.

Funktionen für die unformatierte Ausgabe

ostream * outsp=&outs.put(char c)

c wird in outs.rdbuf() eingefügt. Der Fehlerstatus wird gesetzt, wenn die Einfügung misslingt.

ostream * outsp=&outs.write(char * s, int n)

Es werden n Zeichen, beginnend bei s, in outs.rdbuf() eingefügt. In diesen Zeichen können auch Nullbytes enthalten sein, so dass s keine mit \0 beendete Zeichenkette sein muss.

Weitere Elementfunktionen

ostream * outsp=&outs.flush()

Zeichen werden beim Speichern in einem streambuf-Objekt nicht immer sofort "verbraucht" (indem Sie beispielsweise in eine externe Datei geschrieben werden). Die Verwendung von flush() führt dazu, dass gespeicherte, aber noch nicht "verbrauchte"Zeichen durch den Aufruf von outs.rdbuf()->sync verbraucht werden.
Im BS2000 bedeutet dies, dass die Zeichen an das C-Laufzeitsystem durchgereicht werden.

outs<<manip

Diese Zeile entspricht manip(outs). Syntaktisch erscheint dies zwar wie eine Einfügeoperation, in semantischer Hinsicht handelt es sich aber um eine beliebige Operation(statt der Umwandlung von manip in eine Folge von Zeichen, wie dies durch die Einfügeoperatoren erfolgt).

Positionierungsfunktionen

ostream * outsp=&outs.seekp(streamoff off, ios::seek_dir dir)

Der Zeiger put von outs.rdbuf() wird neu positioniert. Weitere Informationen zum Positionieren finden Sie im Abschnitt zu sbufpub .

ostream * outsp=&outs.seekp(streampos pos)

Der Zeiger put von outs.rdbuf() wird neu positioniert. Weitere Informationen zum Positionieren finden Sie bei sbufpub .

streampos pos=outs.tellp()

Es wird die aktuelle Position des Zeigers put von outs.rdbuf() geliefert. Weitere Informationen zur Positionierung finden Sie im Abschnitt zu sbufpub .

Manipulatoren

outs<<endl

Eine Zeile wird beendet, indem ein Neue-Zeile-Zeichen eingefügt und der Puffer geleert wird. Das Neue-Zeile-Zeichen wird im BS2000 in einen Satzwechsel umgewandelt.

outs<<ends

Eine Zeichenkette wird beendet, indem ein Nullzeichen (0) angehängt wird.

outs<<flush

outs wird geleert.

outs<<dec

Das Formatflag für die Konvertierungsbasis wird auf 10 gesetzt (siehe ios).

outs<<hex

Das Formatflag für die Konvertierungsbasis wird auf 16 gesetzt (siehe ios).

outs<<oct

Das Formatflag für die Konvertierungsbasis wird auf 8 gesetzt (siehe ios).

BEISPIEL

Das folgende Programm gibt verschiedene Datentypen in unterschiedlichen Formaten aus.

#include <iostream.h>
#include <iomanip.h>  /* für setw */
int main()
{
  int i = 50;
  char c = ’d’;
  double d = 1.2;
  float f = 3.1232;
  const char * const p = "abcdefghijklmnopqrstuvwxyz";
  /* zunächst Standarddarstellung für die verschiedenen  */
  /* Datentypen anzeigen                                 */
  cout << i << endl;
  cout << c << endl;
  cout << d << endl;
  cout << f << endl;
  cout << p << endl;
  cout << endl;
  cout.setf( ios::oct, ios::basefield);
  cout << i << endl;  /* gleiche Zahl in Oktalnotation */
  cout << c << endl;
  cout.setf( ios::fixed, ios::floatfield);
  /* fixed-Format für float- und double-Werte */
  cout << d << endl;
  cout << f << endl;  /* obiges Format wird weiterhin eingesetzt */
  cout.setf( ios::right, ios::basefield);
  cout << setw( 50) << flush;
  cout << p << endl;  /* Zeichenkette wird in Feld mit der Breite 50 */
                      /* übertragen */
  return 0;
}

Das Ergebnis der Programmausführung ist:

50
d
1.2
3.1232
abcdefghijklmnopqrstuvwxyz
62
d
1.200000
3.123199
                        abcdefghijklmnopqrstuvwxyz
%  CCM0998 Verbrauchte CPU-Zeit: 0.0009 Sekunden

Beachten Sie, wie der Ganzzahlwert i in zwei verschiedenen Formaten ausgegeben wird. Weiterhin ist bemerkenswert, wie leicht das Format von double- und float-Werten beeinflusst werden kann. Aus dem ersten Teil der Funktion main() wird deutlich, dass die Ausgabebibliothek sinnvolle Standardwerte zur Verfügung stellt, ohne dass der Programmierer diese explizit setzen muss.

SIEHE AUCH


iosmanip, sbufpub