Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS...

31
Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

Transcript of Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS...

Page 1: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C

Dateien

Hochschule Fulda – FB AI

Sommersemester 2014

http://c-ai.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

Dateien 1

• Grundlegender Datentyp FILE • zugrundeliegendes Modell: stream• Daten- oder Bytestrom: Bytes werden

sequentiell gepuffert gelesen / geschrieben• Bsp: printf("HALLO, WELT");

Page 3: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

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

Page 4: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

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 existierenw, wb write - schreiben, Datei wird erzeugt, Dateilänge auf 0 gesetzta, ab append - schreiben, anhängenr+, rb+ update - lesen+schreiben

Page 5: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Dateien 4

• fopen() liefert NULL bei Fehler, Bsp: 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

Page 6: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

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, ...)

Page 7: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

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

Page 8: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

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

Page 9: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

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

Page 10: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

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

Page 11: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

Dateien 10

• Beispiel: filecopy.c

Page 12: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Dateien 11

• Beispiel: numcat.c

Page 13: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Dateien 12

• Beispiel: revcat.c

Page 14: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

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

Page 15: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

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

Page 16: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Dateien 15

• long ftell(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)

Page 17: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

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

Page 18: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Dateien 17

• Fehlerbehandlung• int ferror(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

Page 19: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

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

Page 20: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Dateien 19

• Bsp: Schichten im Betriebsystem

Page 21: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

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

Page 22: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Dateien 21

• Standardfiledeskriptoren– 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

Page 23: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Dateien 22

• Diskussion– Warum Pufferung von IO?– Warum Schichtung Anwendungs-/Systemebene?

Page 24: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Dateien 23

• Beispiel: bytecopy1.c

Page 25: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Dateien 24

• Beispiel: bytecopy2.c

Page 26: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

Dateien 25

• Beispiel: bytecopy3.c

Page 27: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Dateien 26

• Diskussion– Welches bytecopy ist schneller und effizienter? – Warum?

Page 28: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Dateien 27

Page 29: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Dateien 28

• Beispiel: Netzwerkserver

Page 30: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Dateien 29

• Beispiel: Netzwerkclient

Page 31: Programmieren in C Dateien Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ.

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Dateien 30

• Beispiel: Pipe