Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ
Dateien 1 Grundlegender Datentyp FILE zugrundeliegendes Modell: stream Daten- oder Bytestrom: Bytes werden sequentiell gepuffert gelesen / geschrieben Bsp: printf("HALLO, WELT"); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 2 Files Dateien, Pipes, Geräte usw. Bildschirm / Tastatur stdin, stdout, stderr Pipes (anonyme Pipes, FIFOs) Sockets (Netzwerkverbindungen) Drucker Tapes, Festplatte, USB-Stick usw. Effizient für „normale“, sequentielle Files Uneffizient z.B. für Datenbanken Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 3 FILE *fopen(char *pn, char *mode) öffnet Datei mit dem Pfadname pn und verbindet einen stream mit der Datei liefert einen Zeiger vom Typ FILE * auf den geöffneten stream mode gibt den Modus an: r, rb read - lesen, Datei muss existieren w, wb write - schreiben, Datei wird erzeugt, Dateilänge auf 0 gesetzt a, ab append - schreiben, anhängen r+, rb+ update - lesen+schreiben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 4 fopen() liefert NULL bei Fehler, Bsp: void perror(char *msg) FILE *fp; fp = fopen("datei", "r"); if(fp == NULL) { perror("datei"); return(1); } void perror(char *msg) Gibt Systemfehlermeldung auf stderr aus int fclose(FILE *fp) schließt Verbindung zum stream fp Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 5 int fprintf(FILE *fp, char *fmt, /* args */ ...) formatiertes Schreiben auf stream fp liefert die Anzahl geschriebener Bytes printf() fprintf(stdout, ...) int fscanf(FILE *fp, char *fmt, /* args */ ...) formatiertes Lesen von stream fp liefert Anzahl gelesener Elemente scanf() fscanf(stdin, ...) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 6 Zeichen-/Wort-Eingabefunktionen int fgetc(FILE *fp) int getc(FILE *fp) Zeichen von stream fp lesen liefert gelesenes Zeichen, EOF bei Dateiende getchar() fgetc(stdin) oft als Makro implementiert int fgetw(FILE *fp) Wort (Integer) von stream fp lesen liefert gelesenen Integerwert, EOF bei Dateiende Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 7 String-Eingabefunktionen char *fgets(char *s, int n, FILE *fp) Zeile von fp in Puffer s lesen, maximal n Bytes liefert NULL bei Dateiende char *gets(char *s) Zeile von stdin in Puffer s einlesen NULL bei EOF Achtung: Keine Prüfung der Puffergröße Sicherer fgets() statt gets() verwenden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 8 Zeichen-/Wort-Ausgabefunktionen int fputc(int c, FILE *fp) int putc(int c, FILE *fp) Zeichen c auf stream fp ausgeben liefert geschriebenes Zeichen, EOF bei Fehler putchar(c) fputc(c, stdout) oft als Makro implementiert int putw(int w, FILE *fp) Wort w (Integer) auf stream fp ausgeben liefert geschriebenes Wort, EOF bei Fehler Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 9 String-Ausgabefunktionen int fputs(char *s, FILE *fp) String s auf stream fp ausgeben, EOF bei Fehler int puts(char *s) String s auf stdout ausgeben, EOF bei Fehler Ausgabepuffer leeren int fflush(FILE *fp) schreibt Ausgabepuffer des stream fp liefert 0 bei Erfolg, -1 bei Fehler Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 10 Beispiel: filecopy.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 11 Beispiel: numcat.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 12 Beispiel: revcat.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 13 binäre Ein- und Ausgabefunktionen size_t fread(void *p, size_t s, size_t n, FILE *fp) size_t fwrite(void *p, size_t s, size_t n, FILE *fp) Lesen/Schreiben von n Objekten der Größe s aus/in den Puffer p von/auf den stream fp liefert die Anzahl gelesener/geschriebener Objekte n bzw. -1 bei Fehler Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 14 Positionierung in Dateien / streams int fseek(FILE *fp, long o, int w) Setzt den Positionszeiger innerhalb des streams fp auf die neue Position w+o o (offset) gibt den Offset zu w an w (whence) gibt die Ausgangsposition an SEEK_SET Dateianfang + Offset o SEEK_CUR aktuelle Position + Offset o SEEK_END Dateiende + Offset o liefert 0 bei Erfolg, -1 im Fehlerfall Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 15 long ftell(FILE *fp) void rewind(FILE *fp) gibt den aktuellen Wert des Positionszeigers innerhalb der Datei fp aus liefert aktuelle Position vom Dateianfang an gesehen, im Fehlerfall -1 void rewind(FILE *fp) Positionszeiger der Datei fp auf Dateianfang rewind(fp) fseek(fp, 0, SEEK_SET) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 16 Weitere Funktionen int rename(char *old, char *new) Umbennenung von Datei old in new int remove(char *path) Löschen von Datei path Funktionen liefern 0 oder bei -1 bei Fehler int system(char *command) Ausführen des Strings command liefert -1 bei Fehler, 0, wenn Kommando ok Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 17 Fehlerbehandlung int ferror(FILE *fp) int feof(FILE *fp) liefert Wert != 0 bei Fehler in fp, sonst 0 int feof(FILE *fp) liefert Wert != 0 bei EOF in fp, sonst 0 int clearerr(FILE *fp) Setzt Fehler- und EOF-Indikator in fp zurück void perror(char *s) gibt Systemfehlermeldung auf stderr aus Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 18 low-level Systemcalls alle bisher bekannten Funktionen für Eingabe und Ausgabe auf streams / Dateien: arbeiten aus Effizienzgründen gepuffert nutzen für die tatsächlichen Eingabe- und Ausgabeoperationen low-level-Funktionen des Betriebssystems Systemaufrufe oder Systemcalls teilweise nach Posix genormt Unix / Linux ca. 300, Windows Vista geschätzt 360 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 19 Bsp: Schichten im Betriebsystem Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 20 Low-level IO-Funktionen int open(char *path, int flag) int creat(char *path, mode_t mode) öffnen / erzeugen Datei mit Namen path liefern Filedescriptor (Integer), -1 bei Fehler int close(int fd) Schliessen der Datei mit Filedescriptor fd ssize_t read(int fd, void *b, size_t n) ssize_t write(int fd, void *b, size_t n) Lesen/Schreiben von n Bytes aus Puffer b auf fd Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 21 Standardfiledeskriptoren FILE *fdopen(int fd, char *mode) 0 Standardeingabe stdin 1 Standardausgabe stdout 2 Standardfehlerausgabe stderr FILE *fdopen(int fd, char *mode) verbindet einen stream mit einem Filedeskriptor int fileno(FILE *fp) liefert Filedeskriptor zum stream fp Filedeskriptor ist Teil des FILE-Datentyps Zugriff durch Funktion fileno() gekapselt Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 22 Diskussion Warum Pufferung von IO? Warum Schichtung Anwendungs-/Systemebene? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 23 Beispiel: bytecopy1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 24 Beispiel: bytecopy2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 25 Beispiel: bytecopy3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 26 Diskussion Welches bytecopy ist schneller und effizienter? Warum? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 27 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 28 Beispiel: Netzwerkserver Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 29 Beispiel: Netzwerkclient Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 30 Beispiel: Pipe Programmieren in C - Peter Klingebiel - HS Fulda - DVZ