In diesem Abschnitt werden die ostream-Funktionen zur formatierten und unformatierten Ausgabe beschrieben. #include <iostream.h> typedef long streamoff, streampos; class ios enum seek_dir {beg, cur, end}; bin, tabexp}; enum { skipws=01, }; // siehe ios ; dort werden weitere Klassenelemente beschrieben } ; class ostream : virtual public ios { public:
}; class ostream_withassign : public ostream { public:
}; extern ostream_withassign cout;
| |||||||||||||
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
Konstruktoren und Zuweisungostream(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äfixfunktionint 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. Ausgabesuffixfunktionvoid 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. 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
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 Ausgabeostream * 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 Elementfunktionenostream * 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. 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). Positionierungsfunktionenostream * 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 . Manipulatorenouts<<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 | |||||||||||||