2. Programmierung in C

Ähnliche Dokumente
8. Datei-Eingabe und -Ausgabe

8. Datei-Eingabe und -Ausgabe

6. Eingabe und Ausgabe, Dateien

6. Datei-Eingabe und -Ausgabe

Ein-/Ausgabe, Dateisystem. Kapitel 9: Ein-/Ausgabe. Programmieren in C für Elektrotechniker. Programmieren in C. Dateisystem. Programmieren in C

Dateizugriff unter C

Dateioperationen Fachhochschule Würzburg-Schweinfurt Prof. Dr. Martin Ochs. Abspeichern und Einlesen von Texten (Strings) in Dateien

Programmiersprachen Einführung in C

Im Windows Betriebssystem sind Dateien eindeutig gekennzeichnet durch ihren Pfad, Dateinamen und nach einem Punkt die Dateierweiterung.

high level I/O/ low level I/O

Dateien (1) Datenströme

8. Arbeiten mit Dateien

Beispiel / Übung: Prof. Dr. A. Christidis WS 2012/13

E-/A-Funktionalität nicht Teil der Programmiersprache

file:///h:/dokumente/_fh/ ws /etinfoii/vorlesung/infoii...

Dateien. INE2, Mittwoch / TE402 M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Modellierung und Programmierung

File I/O. Persistieren von Daten. Gastvorlesung Ralph Erdt erdt (bei) informatik.fh-wiesbaden.de

Einführung in die Programmierung für Physiker. Die Programmiersprache C Ein- und Ausgabe

Ausgewählte Bibliotheksfunktionen

182. stdio stdio. Eingabe. Ausgabe. Typisch für Zeileneingabe und Analyse: #include <stdio.h>

Dateien. INE2 M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G. Burkert

Programmieren in C. Die C-Standardbibliothek: Datei Ein- und Ausgabe. Prof. Dr. Nikolaus Wulff

Physische Dateistrukturen

2. Programmierung in C

2. Programmierung in C

Input, Output, Dateien

und noch ein Spiel Programmiersprache(n) für technische Anwendungen Dipl.math Gerd H. Neugebauer

Dateien lesen und schreiben mit php

2. Programmierung in C

Algorithmen & Programmierung. Persistenz - Arbeit mit Dateien

2. Programmierung in C

Programmierung mit C Datei-Ein- und Ausgabe

2. Programmierung in C

Strukturen können wie normale Variablen an Funktionen übergeben werden. Strukturen können auch Ergebnis einer Funktion sein

6.2 Extras/Lesen aus Dateien

2. Programmierung in C

RO-Tutorien 3 / 6 / 12

2. Programmierung in C

RO-Tutorien 15 und 16

2. Programmierung in C

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Datei-Verarbeitung. Peter Sobe 60

2. Programmierung in C

Einführung in C. EDV1-04C-Einführung 1

INE1 Ein-/Ausgabe, Dateien (Files) Einführung Datenstruktur und Operationen Textdateien Binärdateien Standard Streams

RO-Tutorien 17 und 18

Dr. Monika Meiler. Inhalt

Zeiger in C und C++ Zeiger in Java und C/C++

Programmieren 1 C Überblick

Programmiersprachen Einführung in C

I Dateisysteme. I.1 Allgemeine Konzepte. Einordnung. Prozessor (CPU, Central processing unit) Ein-, Ausgabegeräte/ Periphere Geräte (I/O Devices)

Informatik I Programmieren in C

Übersicht. Informatik 1 Teil 10 Dateien

GI Vektoren

Linux. Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm. FB Automatisierung und Informatik.

Linux. Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm. Hochschule Harz. FB Automatisierung und Informatik.

Ein- und Ausgabe mit Dateien

Kompaktkurs Einführung in die Programmierung. 11. Ein- und Ausgabe

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 23

Programmiersprachen Einführung in C

Ein- und Ausgabe mit Dateien

Ulrich Stein

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Teil 7: Präprozessor und Ein-/Ausgabe Gliederung

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Programmierung mit C Zeiger

C für Java- Programmierer

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Probeklausur Name: (c)

2. Programmierung in C

Informatik für Ingenieure (InfIng)

Inhalte. Einführung. Algorithmus, Programmiersprache, Compiler und Linker. Kontrollstrukturen. Präprozessoranweisungen. Libraries

Programmieren in C++

C für Java-Programmierer

Programmierkurs Kapitel 4: Dateien Seite 1. Verwaltungfeld im Speicher. 4.1 Alternativen zur Programmierung der Eingabe und der Ausgabe

Michael Dienert. 8. Dezember 2016

Dr. Monika Meiler. Inhalt

8. Strukturen und Dateien Strukturen und Dateien

Programmierkurs C++ Variablen und Datentypen

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

1. Allgemeine Datei (Binärdatei mit formatierten Inhalt)

Einführung in die Programmiersprache C

2. Programmierung in C

Übersicht Shell-Scripten

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Arrays (Felder/Vektoren)

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

File I/O mit CRTL unter OpenVMS

Transkript:

2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten Operatoren, Ausdrücke und Anweisungen Kontrollstrukturen (Steuerfluss) Funktionen Felder (Arrays) Zeiger, Zeigerarithmetik, Zeiger-Dereferenzierung Zeichenketten (Strings) Benutzerdefinierte Datentypen Speicherverwaltung und Datenstrukturen Dateiarbeit Bitlevel-Verarbeitung Peter Sobe

Datei-Eingabe und -Ausgabe Dateien: sind benannte Objekte, die eine Speicherung von Anwendungsdaten auf einem linearen Adressraum zulassen unterliegen einer persistenten Speicherung, d.h. Daten bleiben nach Beendigung der Anwendung und auch nach Abschalten des Systems erhalten werden im Dateisystem verwaltet, das ein Teil des Betriebssystems ist. Das Dateisystem sorgt für Zugriff über Verzeichnisse, Dateinamen, für Pufferung, Zugriffsschutz und Speicherplatzverwaltung Peter Sobe 2

Dateien: Datei-Eingabe und -Ausgabe Dateien können intern beliebig strukturiert sein: Binärdaten (anwendungsspezifische Formate, Bilddateien, Audio-/Video) Textdaten (lesbarer Text, nur die Formatierung ist anwendungsabhängig) XML-Datenformate Hinweis auf Typ/Struktur der Datei über Dateityp, z.b. bei bild.jpg wird eine Bilddatei im JPEG-Format angenommen Der Zugriff auf Daten in Dateien findet unter vollständiger Kontrolle eines Anwendungsprogramms statt. Peter Sobe 3

Datei-Eingabe und -Ausgabe In C sind schon eine Reihe von Standarddateien vordefiniert und bei Start des Programms geöffnet. Handle stdin stdout stderr Kanal, Strom Standardeingabe Standardausgabe Standardfehlerausgabe Diese Standard-Dateien sind für C standardisiert. Auch andere Programmiersprachen (z.b. Java) stellen ähnliche Mechanismen bereit. Peter Sobe 4

Typische Abfolge der Funktionsaufrufe Schritt 1: Datei öffnen Nach Angabe eines Dateinamens und des Zugriffsmodus wird eine Datei geöffnet. Nachfolgende Funktionen können ein Datei- Handle (FILE *f) als Referenz auf die geöffnete Datei benutzen. Es können mehrere Dateien gleichzeitig geöffnet werden. FILE *f; f = fopen( C:\\Daten\\meinedatei.txt, rt ); /* jetzt folgen Zugriffe mit Angabe von f */ Peter Sobe 5

Typische Abfolge der Funktionsaufrufe Schritt 2: (wahlweise Positionieren), Zugriffe Zugriffe erfolgen standardmäßig von Anfang des Dateiinhalts. Ein s.g. Dateipositionszeiger wird mit jedem Zugriff weitergestellt und aufeinander folgende Zugriffe beziehen sich damit auf fortlaufende Dateiinhalte (sequentielle Organisation, vgl. Abspielen von Musik von CD). Es gibt Funktionen zum expliziten Positionieren. int n; double z1, z2; n = fscanf(f, %lf %lf,&z1, &z2); /* weitere Zugriffe */ rewind(f); Peter Sobe 6

Typische Abfolge der Funktionsaufrufe Schritt 3: Datei schließen Soll kein weiterer Zugriff auf die Datei mehr erfolgen, wird die Datei (über die Angabe des Datei-Handle) geschlossen. Damit werden Inhalte und Änderungen für andere Anwendungsprozesse sichtbar. fclose(f); /* f kann jetzt wieder zum Öffnen einer anderen Datei benutzt werden */ Peter Sobe 7

Zugriff auf Text- vs. Binärdateien Textdateien, mit lesbarem Text (z.b. im Editor) Funktionen für zeichenweise Ein- und Ausgabe (E/A): fgetc(), fputc() wird z.b. als file get character gelesen zeilenweise E/A: fgets(), fputs() formatierte E/A: fscanf(), fprintf() Binärdateien, deren Inhalt die interne Repräsentation der Daten enthält, nicht (ohne weiteres) mit einem Editor lesbar blockweise und elementweise E/A: fread(), fwrite() Peter Sobe 8

Zugriffsmodi beim Öffnen einer Datei Der bei der fopen()-funktion angegebene Zugriffsmodus bestimmt, wie eine Datei prinzipiell zu verarbeiten ist. Zeichen Datei öffnen zum Bedeutung r Lesen Fehler, wenn Datei nicht existiert w Schreiben Datei wird neu erzeugt, ggf. überschrieben a Anfügen Datei wird erzeugt, falls sie nicht existiert r+ Lesen und Schreiben Fehler, wenn Datei nicht existiert w+ Schreiben und Lesen Datei wird neu erzeugt, ggf. überschrieben a+ Lesen und Anfügen Datei wird erzeugt, falls sie nicht existiert Die Zusatzangabe t (text) oder b (binär) wird dem Zugriffsmodus hinzugefügt, z.b. rt, wb, at+, rb+ usw. Peter Sobe 9

Öffnen und Fehlerbehandlung In C wird eine Datei mit fopen bzw. fclose geöffnet bzw. wieder geschlossen. Dabei muss das Datei-Handle (FILE *) deklariert sein: #include <stdio.h> int main() { FILE *fp; //Deklaration Datei-Handle } fp = fopen( c:\\meinefreunde.txt, rt ); //Pfad-Angabe if (fp==null) { printf( Fehler ); return -1; }... fclose(fp); return 0; Kann die Datei nicht geöffnet werden, ist fp mit NULL belegt. Deshalb sollte nach fopen das Dateihandle gegen NULL getestet werden, ehe eine Verarbeitung eingeleitet wird. Peter Sobe 10

High-Level-Zugriff: Zeichenweises Lesen In C wird mit fgetc() eine Datei zeichenweise gelesen: #include <stdio.h> void main() { char c; FILE *fp; fp = fopen( c:\\dat.txt, rt ); if (fp!=null) { c=fgetc(fp); //Lesen nächstes Zeichen if (c==eof)... //Prüfen auf EndOfFile } fclose(fp); Nach jeder Leseoperation sollte auf das Erreichen des Dateiendes (EOF) getestet werden. Peter Sobe 11

Zeichenweises Lesen Typischerweise kann man in C-Programmen beim zeichenweisen Lesen und Verarbeiten einer Datei eine nichtabweisende Schleife verwenden: #include <stdio.h> void main() { char c; FILE *fp; fp = fopen( c:\\dat.txt, rt ); if (fp!=null) { do { c=fgetc(fp); //Lesen nächstes Zeichen... Verarbeitungsanweisungen } while (c!=eof) ; //Prüfen auf End Of File } if (! fclose(fp)) // ungleich 0 -> Erfolg printf( Datei erfolgreich geschlossen ); } Peter Sobe 12

High-Level-Zugriff: Zeichenweises Schreiben In C wird mit fputc() in eine Datei zeichenweise geschrieben: #include <stdio.h> void main() { } char c; FILE *fp; fp = fopen( c:\\dat.txt, wt ); c= A ; fputc(c,fp); //Schreiben des Zeichens c... fclose(fp); Peter Sobe 13

Zeilenweises Lesen In C wird mit fgets() eine Datei zeilenweise gelesen. Dabei muss im Programm ein Pufferspeicher als char-feld vereinbart werden, der die eingelesene Zeile aufnimmt. Es ist zweckmäßig, einen char-zeiger zu deklarieren, der durch fgets() belegt wird und auf den Anfang des Puffers zeigt bzw. auf NULL im Fehlerfall oder bei Erreichen des Dateiendes. char puffer[81]; char *z; FILE *fp; z=fgets(puffer,81,fp); //Lesen Zeile Peter Sobe 14

Zeilenweises Schreiben In C wird mit fputs() eine Datei zeilenweise geschrieben: #include <stdio.h> void main() { char c; FILE *fp; char zeile[81]= Das ist eine Zeile! ; } fp = fopen( c:\\dat.txt, wt ); fputs(zeile, fp); //Schreiben Zeile... fclose(fp); Peter Sobe 15

Formatiertes Lesen: fscanf() In C wird mit fscanf() aus einer Datei formatiert gelesen: #include <stdio.h> struct abteilung{ int nr; char nam[20]; char leit[7];} int main() { FILE *fp; int n; struct abteilung a; fp = fopen( c:\\dat.txt, r ); } n=fscanf(fp, %d %s %s, &a.nr, a.nam, a.leit); /*Lesen der Objekte nr, nam, leit Rueckkehrwert (n) ist die Anzahl gelesener Obj. Rueckkehrwert 1 bei EOF*/... Peter Sobe 16

Formatiertes Schreiben: fprintf() In C wird mit fprintf() eine Datei formatiert geschrieben: #include <stdio.h> struct abteilung {int nr; char nam[20]; char leit[7];}; int main() { FILE *fp; int n; struct abteilung a={111, Produktion, 4531 }; fp = fopen( c:\\dat.txt, wt ); } n=fprintf(fp, %d %s %s, a.nr, a.nam, a.leit); //Schreiben von Objekten nr,nam,leit // Rückkehrwert n ist die Anzahl geschriebener Obj. // Rückkehrwert 1 bei EOF... Peter Sobe 17

Zugriff auf Binärdateien (1) Universelle Funktionen fread(), fwrite(): Lesen mit fread: #include <stdio.h> int main() { FILE *fp; fp = fopen( c:\\dat.bin, r ); } n_gelesen=fread(puffer_ptr, laenge, anz_elemente, fp ); Es werden laenge*anz_elemente Bytes aus der Datei in den Puffer (puffer_ptr) gelesen. Die Anzahl gelesener Elemente wird zurückgegeben. Peter Sobe 18

Zugriff auf Binärdateien (2) Universelle Funktionen fread(), fwrite(): Schreiben mit fwrite: #include <stdio.h> int main() { FILE *fp; fp = fopen( c:\\dat.bin, w ); } n_geschrieben=fwrite(puffer_ptr, laenge, anz_elemente, fp ); Es werden laenge*anz_elemente Bytes aus dem Puffer (puffer_ptr) in die Datei geschrieben. Die Anzahl geschriebener Elemente wird zurückgegeben. Peter Sobe 19

Dateiende Beim Lesen (egal ob zeichen-, zeilenweise, formatiert oder direkt von einer Binärdateien) ist das Erkennen des Dateiendes wichtig. Die erste Lesefunktion, die nach Erreichen des Dateiendes ausgeführt wird, erzeugt ungültige Inhalte (oder EOF). Testen mit feof(): #include <stdio.h> int main() { int n; FILE *fp = fopen( c:\\dat.bin, rt ); while (!feof(fp)) { n=fscanf(fp, %d %s %f, &intzahl, name, &floatzahl ); if (n==3) { /* erwartete Anzahl gelesener Werte, jetzt weiterverarbeiten*/ } } Peter Sobe 20

Positionieren in Dateien (1) Zurücksetzen einer Datei an den Anfang: void rewind(file *fp); fp ist dabei das Datei-Handle. Die Funktion rewind() erzeugt bei Ausführung keinen Rückkehrwert. Positionieroperation auf eine bestimmte Position: int fseek(file *fp, long anz, int pos_mode); Der Parameter anz gibt die Anzahl der Bytes relativ zu pos_mode an, um die der Dateizeiger bewegt werden soll. Für pos_mode gibt es nur drei Möglichkeiten: 0 für Dateianfang (Konstante SEEK_SET), 1 für aktuelle Position (Konstante SEEK_CURR) und 2 für Dateiende (SEEK_END). Bei fehlerfreier Ausführung ist der Rückkehrwert 0, sonst ungleich 0. Peter Sobe 21

High-Level-Zugriff: Positionieren in Dateien (2) Beispiel: fseek(fp, -10L, SEEK_CURR); Der Dateizeiger wird ab der aktuellen Zeigerposition um insgesamt 10 Bytes zurückgesetzt. Mit der Funktion long ftell(file *fp) wird der aktuelle Dateizeiger relativ zum Dateianfang (als Anzahl der Bytes ) zurückgegeben. ftell sollte wegen der unterschiedlichen Darstellung des Zeilenendes nur im Binärmodus verwendet werden. Peter Sobe 22

Low-Level Verarbeitung von Dateien Unterschied der Zugriffsarten: Anwendungsprogramm Standardbibliothek High-Level- Zugriffsfunktionen: Vielzahl von Funktionen, E/A-gepuffert, komfortabel Betriebssystem, z.b. Windows, Unix Low-Level- Zugriffsfunktionen: Minimalumfang, einfach, schnell, aber wenig komfortabel Low-Level-Funktionen hier nicht weiter ausgeführt. Peter Sobe 23

Verschiedene Funktionen für die Dateiarbeit In C werden für Hilfszwecke rund um die Datei- Verarbeitung eine Reihe von Funktionen angeboten: Das sind vor allem Funktionen für die Arbeit mit Verzeichnissen und Laufwerken das Umbenennen und Löschen von Dateien/Ordnern das Positionieren des Dateizeigers und die Fehlerbehandlung Peter Sobe 24

Funktionen für die Arbeit mit Verzeichnissen (1) Das aktuelle Laufwerk kann man mit der Funktion void _dos_getdrive(unsigned *lw) ermitteln. Beispiel: unsigned d; _dos_getdrive(&d); //ermittelt aktuelles LW printf("das aktuelle LW ist: %c\n", d + 'A' - 1); Es wird die aktuelle Laufwerks-Nummer zurückgegeben, A=1, B=2, C=3,... Nur in Windows möglich! Andere Betriebssysteme benutzen keine Laufwerke. Peter Sobe 25

Funktionen für die Arbeit mit Verzeichnissen (2) Das aktuelle Laufwerk kann man mit der Funktion void _dos_setdrive(unsigned lw,unsigned *anz) neu gesetzt werden. Beispiel: unsigned n; _dos_setdrive(3,&n); //setzt aktuelles LW auf C printf( Es gibt insgesamt %d LW \n",n); Es wird die max. Anzahl von logischen LW-Nummern zurückgegeben. Peter Sobe 26

Funktionen für die Arbeit mit Verzeichnissen (3) UNIX-Dateisysteme (POSIX Standard) Ermitteln des aktuellen Arbeitsverzeichnisses: char *getcwd(char *buf, size_t size); Schreibt das aktuell eingenommene Verzeichnis in die Zeichenkette buf mit maximal size Zeichen. Bei Erfolg wird der Zeiger buf zurückgegeben, anderenfalls NULL. Die Variable errno zeigt den Grund des Fehlers an, z.b. ERANGE wenn size zu kurz ist. Setzen: int chdir(const char *pfad); // gibt 0 bei Erfolg zurück Peter Sobe 27

Durchlaufen von Verzeichnissen Mit den Funktionen unsigned _findfirst(const char *pfad, struct _finddata_t *fblk) und unsigned _findnext( struct _finddata_t *fblk) kann der Inhalt eines Verzeichnisses schrittweise gelesen werden. Der pfad-parameter ist die Adresse eines Pfades (z.b. c:\temp)..), der Parameter fblk ist die Adresse einer Strukturvariablen, die dann die Resultate enthält (z. B.Namen der Datei, Größe in Bytes, Änderungsdatum und zeit). Peter Sobe 28

Beispiel: Durchlaufen von Verzeichnissen _finddata_t filesfound; intptr_t f = _findfirst("c:\\temp\\*.*",&filesfound); //Alle Dateien in C:\TEMP if ( f!= -1L ) { do { if (!( filesfound.attrib & _A_SUBDIR ) ) { //Verzeichnis ausschliessen printf("%s %Iu\n",filesfound.name,filesfound.size); } } while ( _findnext(f,&filesfound)==0 ); //Nächste Datei _findclose(f); //Handle schliessen } Peter Sobe 29

Funktionen für die Arbeit mit Verzeichnissen Das Anlegen (Erzeugen) eines Ordners erfolgt mit der C-Funktion int mkdir(cont char *pfad). Bei fehlerfreier Ausführung ist der Rückkehrwert 0, sonst 1. char pfad[30]= c:\\temp\\neu ; if (mkdir(pfad)) printf( \nfehler! ); else printf( \nordner erfolgreich erzeugt ); Peter Sobe 30

Umbenennen und Löschen von Dateien/Ordnern Das Umbenennen einer Datei/ eines Ordners erfolgt mit der C- Funktion int rename(const char *alt, const char *neu). Die Parameter alt und neu können vollständige Pfadangaben enthalten. Beide Pfade müssen gleich sein. Der Zugriff auf die Datei/Ordner muss nach Zugriffsrechten erlaubt sein. Bei fehlerfreier Ausführung ist der Rückkehrwert 0, sonst 1. char a[20]= c:\\temp\\x.txt ; char n[20]= c:\\temp\\y.txt ; // bei einem Ordner texte würde der Pfad z.b. sein // char a[20]= c:\\temp\\texte ; if (! rename(a,n)) printf( \nfehler! ); Peter Sobe 31

Löschen von Dateien/Ordnern Das Löschen einer Datei erfolgt mit der C-Funktion int remove(const char *name). Beispiel: char datei[20]= c:\\temp\\x.txt ; if (! remove(datei)) printf( \nfehler! ); else printf( \ndatei erfolgreich gelöscht ); Gesperrte Dateien: Die im Parameter angegebene Datei darf zu diesem Zeitpunkt nicht in Nutzung sein, d.h. muss geschlossen sein. Bei fehlerfreier Ausführung ist der Rückkehrwert 0, sonst 1. Peter Sobe 32