programmieren in c dateien hochschule fulda – fb ai sommersemester 2014 peter klingebiel, hs...
TRANSCRIPT
Programmieren in C
Dateien
Hochschule Fulda – FB AI
Sommersemester 2014
http://c-ai.rz.hs-fulda.de
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");
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
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
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
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, ...)
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
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
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
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Dateien 10
• Beispiel: filecopy.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Dateien 11
• Beispiel: numcat.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Dateien 12
• Beispiel: revcat.c
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
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
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)
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
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
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Dateien 19
• Bsp: Schichten im Betriebsystem
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
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Dateien 22
• Diskussion– Warum Pufferung von IO?– Warum Schichtung Anwendungs-/Systemebene?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Dateien 23
• Beispiel: bytecopy1.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Dateien 24
• Beispiel: bytecopy2.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Dateien 25
• Beispiel: bytecopy3.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Dateien 26
• Diskussion– Welches bytecopy ist schneller und effizienter? – Warum?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Dateien 27
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Dateien 28
• Beispiel: Netzwerkserver
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Dateien 29
• Beispiel: Netzwerkclient
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Dateien 30
• Beispiel: Pipe