Input / Output in C, C++ Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling Page 1
Ausgaben in C,C++ - generell Fuer C basierte Ausgaben: #include <stdio.h> // C header oder #include <cstdio> // C++ header Fuer C++ #include <iostream.h> // C header oder #include <iostream> // C++ header => ältere und neuere Versionen der Biblioteken unterschiedliche Implementierungen mit gleichem Interface ältere Version: globaler Namensraum neuere Version: Namensraum std; (verwending von Templates) Page 2
Streams Stream I / O physikalisches Device Text, Zahlen... Bildschirm, Datei, Drucker... C: Eine standard Eingabe: zwei standard Ausgaben: C++: Eine standard Eingabe: zwei standard Ausgaben: stdin (Tastatur) stdout (Bildschirm) errout (Bildschirm) -> Umleitbar: zb: Fehler in Datei cin (Tastatur) cout (Bildschirm) cerr (Bildschirm) -> Umleitbar: zb: Fehler in Datei Page 3
C - Beispiel Beispiel TEST.C: int main(void){ char str[80]; gets(str); // liest von Standardeingabe stdin printf(str); //schreibt nach standardausgabe stdout Normalerweise Bildschirmein- und -ausgabe Mit Umleitung: TEST < INPUT.file > OUTPUT.file Dateien als Eingabe und Ausgabe. Page 4
C std Ein- und Ausgabe printf(controlstring, variables); // Ausgabe auf stdout scanf( controlstring, variable addresses); controlstring ist eine Textausgabe mit Variablen oder formatierter Ausgabe. Meiner Meinung nach wichtige Formate %d, %i int mit Vorzeichen %c char %f float %s string Beispiele: Printf( %f\n,10.12345); // 10.12345 Printf( %10f\n,10.12345); // 10.12345 Printf( %10.4f\n,10.12345); // _10.1234 Printf( %-8.4f\n,10.12345); // _10.1234 scanf( %d%[abcd]%s,&i, str, str2); Eingabe von: 123abcdef gibt: i=123, str=abcd\0, str2= ef\0; Page 5
C Dateiein- und -ausgabe f - ein und -ausgabebefehle verbinden Dateipointer mit I/O-Streams fopen, fclose, fprintf, fscanf, fputs, fgets,... Dateien öffnen und schliessen: FILE *fp; fp = fopen(filename,mode); // mode=r,w,a... fclose(fp); fprintf(file *fp, controlstring, variables); analog fscanf(); Ähnliche Befehle: sprintf(arrayvariable, controlstring, Variables); analog sscanf(); Page 6
C++ Ein- und -ausgabe Gehören zur Basisklasse ios Streams besitzen als Objekte veränderbare Eigenschaften: Beispiel Standardoutputstream cout: cout.width(10); // Ausgabeformat 10 Zeichen ein. cout.precision(3); // entsprenende Nachkommastellen (hier 3) cout.fill(*), // Setzt das Füllzeichen cout << Hi! << \n ; // gibt: *******Hi! aus. Weitere veraenderbare Eigenschaften über Flags: cout.setf(ios::uppercase); cout.unsetf(ios::uppercase); showpoint // Dezimalpunkt und folgende Nullen ausgeben left right oct,dec,hex Mehrere Flags setzen: cout.setf(ios::scientific ios::showpos); cout << 100.2 << \n Ausgabe: +1.0012E+02 Page 7
C++ Stream-Manipulatoren Formatierung von Streams kann man auch im streaming verändern, mittels Manipulatoren: cout << uppercase << moin moin << endl; cout << setfill(*); cout << setiosflags(ios::showpos) << resetiosflags(ios::showpo cout << showpos << noshowpos; einfacher,wenn sich die Formatierung häufig ändert. Manipulatoren ohne Argument haben kein (). benötigt wird dazu: #include <iomanip> mann kann auch selbst << überladen und Manipulatoren erstellen. Page 8
C++ Dateistreams Dateiein- und -ausgabe in C++ analog zu C++streams und C. #include <fstream> fstream filestream; //Datei für Input und Output öffnen ofstream filestream; //Datei für Output öffnen ifstream filestream; //Datei für Input öffnen widergabewert bool: 'false' wenn Gerät nicht geöffnet filestream.open( name, ios::out); Kopplung von stream an Gerät(Datei) und Vergabe von Streamparametern ios::out // Ausgabe ios::in // Eingabe... filestream.close(); Page 9
C++ Dateistreams ofstream besitzt Lesezeiger ifstream besitzt Schreibezeiger fstream besitzt zwei Zeiger Lesezeiger: Zeigt bei zum Lesen geöffneten Dateien zunächst auf Dateianfang Schreibzeiger: Zeigt bei zu schreibenden Dateien zunächst auf Dateiende Manipulatoren sollte nur auf Binärdateien verwendet werden: istream.seekg(offset,origin); ostream.seekp(offset, origin); # Zeichen ios::beg //(begin) ios::cur //(current) ios::end //(end) Page 10
C++ weitere Streammethoden Für ifstreams: getline(char_array,char_number); getline(char_array,char_number,delimiter); kann zum lesen und füllen von CharArrays genutzt werden. Terminierung des Arrays mit \0 bei CR oder erreichen von char_number-1 (oder weiteren delimiters). filestream.getline(string,255,' '); EOF() ist boolscher operator der das Ende der Datei markiert 1 wenn end of file erreicht. flush() schreibt Puffer nach Device, auch wenn noch nicht voll. zb: for(int n=0;n<100;++n){ cout << n << /r <<flush; Page 11
C++ Error Handling Fehlerabfang durch try - catch Block: try{... Befehle if () throw fehlertyp;...//(wird bei if(true) nicht aufgeführt) catch(fehlertyp 1){ Fehlerbefehle catch(fehlertyp 2){ Fehlerbefehle catch(...){ Fehlerbefehle fehlertyp: alle Typen zb int,double,char... throw Wert falsch ; //gibt str Fehler aus. Fehlerbefehle sind üblicherweise: cerr, exit() oder abort(); so dass man den fehler verfolgen kann. zb: catch(const char *str){ cerr << str << endl; exit(); Page 12