Die Ein/Ausgabe ist nicht in der Sprache definiert, sondern Bestandteil der Standardbibliothek.
ANSI C | C++ | |
Stream | #include <stdio.h> | #include <iostream.h> |
I/O | printf(...) | cout << X; |
scanf(...) | cin >> X; | |
File | #include <stdio.h> | #include <fstream.h> |
I/O | FILE out; | ofstream out("o"); |
out=fopen("o","w"); | ||
fprintf(out, ...) | out << X; | |
FILE inp; | ifstream inp("i"); | |
inp=fopen("i","r"); | ||
fscanf(inp, ...) | inp >> X; | |
String | #include <stdio.h> | #include <strstream.h> |
I/O | sprintf(...) | char t[80]; |
ostrstream otxt(t,80); | ||
otxt << X; | ||
sscanf(...) | istrstream itxt(t,80); | |
itxt >> X; |
Drei Output-Stream-Objekte sind definiert:
Die Ausgabe erfolgt mit dem Einfügeoperator <<
, der
für die Standardtypen vordefinert ist. Z. B.:
ostream& operator<<(char); ostream& operator<<(unsigned char); ostream& operator<<(const char*); ostream& operator<<(int); ostream& operator<<(long); ostream& operator<<(double); ostream& operator<<(float); ostream& operator<<(unsigned int); ostream& operator<<(unsigned long); ostream& operator<<(void*); ostream& operator<<(short); ostream& operator<<(unsigned short)
Für formatierte Ausgabe stehen sog. Manipulatoren
zur Verfügung, die ebenfalls durch <<
in den
Ausgabe-Stream eingefügt werden. Dazu ``#include <iomanip.h>
''.
Wichtige Ausgabe-Manipulatoren | |
Manipulator | Bedeutung / Benutzung |
hex | Hex-Ausgabe |
cout << hex << 17; | |
dec | Dezimal-Ausgabe |
cout << dec << i; | |
oct | Oktal-Ausgabe |
cout << oct << 100; | |
endl | Newline und Flush |
cout << endl; | |
flush | Flush |
cout << flush; | |
setw(int) | Feldweite |
cout << setw(8); | |
setfill(int) | Füllbuchstabe |
cout << setfill('.'); | |
setiosflags(long) | Setzen von Flags |
cout << setiosflags(ios::right); | |
resetiosflags(long) | Rücksetzen von Flags |
cout << resetiosflags(ios::dec); | |
setprecision(int) | Fließpunktpräzision |
cout << setprecision(6); |
Einige wichtige ios-Flags (Ausgabe) | |
Flag | Bedeutung |
ios::left | Linksbündige Ausgabe |
ios::right | Rechtsbündige Ausgabe |
ios::scientific | Wissenschaftliches Float-Format |
z.B. -1.23E+04 | |
ios::fixed | Festpunkformat für Float |
z.B. 123.45 |
Beispiel:
#include <iostream.h> #include <iomanip.h> struct buch { char *kapitel; int seite; } inhalt[4] = { "Einleitung", 1, "Grundlagen", 11, "Neuigkeiten", 102, "Zusammenfassung",102 }; void druckeinhalt() { cout << setfill('.'); for (int kap=0; kap<4 ; kap++) { cout << setiosflags(ios::left) << setw(20); cout << inhalt[kap].kapitel; cout << resetiosflags(ios::left) << setw(4); cout << inhalt[kap].seite << endl; } }
liefert die Ausgabe:
Einleitung.............1 Grundlagen............11 Neuigkeiten..........102 Zusammenfassung......102
Selbstdefinierte Einfügeoperatoren <<
Die erforderliche Signatur ist
ostream& operator << (ostream& OS, classtype& E)
oder
ostream& operator << (ostream& OS, classtype E)
Beispiel:
#include <iostream.h> class date { int day, month, year; public: date(int d, int m, int y) : day(d), month(m), year(y) {}; friend ostream& operator << (ostream&, date&); }; ostream& operator << (ostream& OS, date& D) { OS << D.day << '.' << D.month << '.' << D.year; return OS; } int main(void) /* */ { date today(3,5,1993); cout << today; }
Ein Input-Stream-Objekt ist definiert:
Die Eingabe erfolgt mit dem Extraktionsoperator >>
, der
für die Standardtypen vordefiniert ist.
Der Extraktionsoperator betrachtet ``Whitespace'' (Leerzeichen, Tabulatoren, Zeilenende) als Abgrenzung zwischen Eingabesymbolen und nicht als eigenständige Symbole.
Das Programm
char z; while (cin >> z) cout << z << ", "
erzeugt aus der Eingabe
ab c
die Ausgabe
a, b, c,
#include <iostream.h> #include <string.h> const int puffergroesse = 28; char puffer[puffergroesse]; int main(void) { int anzahl = 0, max = 1, laenge; char laengstes[puffergroesse]; while (cin >> puffer) { laenge = strlen(puffer); anzahl++; if (laenge > max) { max = laenge; strcpy(laengstes, puffer); } /* if */ } /* while */ cout << "Anzahl der Woerter: " << anzahl << endl; cout << "Laengstes Wort: " << laengstes << endl; } /* main */
ergibt mit der Eingabe
Wo immer im Mittelalter innerhalb der von Deutschen besiedelten Landstriche sich Zuege feinerer Gesittung und Geselligkeit zeigten, stammten sie aus dem Morgenland oder aus dem Erbe der roemischen Kultur.
die Ausgabe
Anzahl der Woerter: 29 Laengstes Wort: Geselligkeit
Wichtige Eingabe-Manipulatoren | |
Manipulator | Bedeutung / Benutzung |
hex | Hex-Eingabe |
cin >> hex >> i; | |
dec | Dezimal-Eingabe |
cin >> dec >> i; | |
oct | Oktal-Eingabe |
cin >> oct >> i; | |
setw(int) | Feldweite |
cin >> setw(24); | |
setfill(int) | Füllbuchstabe |
cin >> setfill(' '); | |
setiosflags(long) | Setzen von Flags |
cin >> setiosflags(ios::fixed); | |
resetiosflags(long) | Rücksetzen von Flags |
cin >> resetiosflags(ios::dec); | |
setprecision(int) | Fließpunktpräzision |
cin >> setprecision(12); |
Einige wichtige ios-Flags (Eingabe) | |
Flag | Bedeutung |
ios::skipws | Überlese Whitespace |
ios::scientific | Wissenschaftliches Float-Format |
z.B. -1.23E+04 | |
ios::fixed | Festpunkformat für Float |
z.B. 123.45 |
Mit setw(int) lässt sich verhindern, daß Eingabepuffer überlaufen. Obiges Programm hätte die Strings besser so eingelesen:
... cin >> setw(puffergroesse); // lies hoechstens while ( cin >> puffer) // puffergroesse Zeichen { ...
Weitere Eingabeoperationen
Die Klasse istream stellt außer dem Operator >>
noch andere nützliche Funktionen zur Verfügung, z. B.
istream& get(char& c); istream& get(char* p, int n, char delim = '\n'); istream& putback(char c); int get(); int peek();
Benutzerdefinierte Extraktions-Operatoren >>
lassen sich
ebenfalls definieren.
Die erforderliche Signatur ist
istream& operator >> (istream& IS, classtype& E)
Solche Eingabefunktionen sind in der Regel komplizierter als Ausgabefunktionen, da sie im Fehlerfall die Statusbits des Eingabestroms setzen müssen.
Öffnen eines Ausgabe-Files und Verbindung mit einer Datei:
ofstream outp("outfilename");
Öffnen eines Eingabe-Files und Verbindung mit einer Datei:
ifstream inp("infilename");
Öffnen eines Ein/Ausgabe-Files und Verbindung mit einer Datei:
fstream iof("filename", mode);
Test, ob das Öffnen der Datei erfolgreich war:
ifstream eingabe("inp"); if (!eingabe) { cerr << "Cannot open file inp\n"); exit(1); }
Ein File-Objekt läßt sich auch erst kreieren und später öffnen:
ifstream eingabe; // Default-Konstruktor eingabe.open("inp"); // Oeffnen ... eingabe.close(); // Schliessen
Der I/O-Modus kann auch explizit angegeben werden, z. B.:
ifstream inp("infile", ios::in); ofstream outp("outfile", ios::out);
Einige wichtige I/O-Modi | |
Flag | Bedeutung |
ios::app | Anhängen von Daten an Ausgabe-File |
ios::out | Ausgabe (mit Überschreiben) |
ios::in | Eingabe |
ios::nocreate | Öffnet nur Dateien, die existieren |
ios::noreplace | Öffnet nur Dateien, die nicht existieren, |
es sei denn zum Anhängen. |
Neben den Operatoren << und >> können auch die Funktionen get() und put() benutzt werden.
#include <stdlib.h> // fuer exit() #include <fstream.h> int main(int argc, char **argv) { if (argc < 3) { cerr << "Usage: filecopy inp outp\n"; exit(0);} ifstream inp(argv[1]); if (!inp) { cerr << "Cannot open " << argv[1]; exit(1);} ofstream outp(argv[2]); if (!outp) { cerr << "Cannot open " << argv[2]; exit(1);} char c; // jetzt geht's los: while (inp.get(c) && outp) outp.put(c); } /* main */
Zwei vordefinierte Klassen:
Beispiel:
const int buflen = 128; char buf[buflen]; char *greet(char *name) { // stream oeffnen und mit "buf" verbinden: ostrstream s(buf,buflen); s << "Hello " << name << "!\n"; return buf; } int main(void) { cout << greet("Krause"); } /* main */
Beispiel:
const int buflen = 128; char buf[buflen] = "120 Mueller 17.25"; int main(void) { int num; char name[20]; float dollar; istrstream s(buf,buflen); s >> num >> name >> dollar; cout << "Num: " << num << " Name: " << name << " Dollar: " << dollar << endl; } /* main */