Agenda für heute, 1. Juni, 2006
• Permanente DatenspeicherungPermanente Datenspeicherung
• Deklaration von Files
• Files verwenden
• Filetypen: Drei Kategorien
• Sequentielle Files
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Permanente Datenspeicherung
Daten, die während der Ausführung eines Computerprogramms erzeugt werden, gehen bei Beendigung des Programms verloren,ausser sie werden als Datei auf ein permanentes Speicher-medium geschrieben
Solche Dateien werden in Pascal mit Variablen vom Datentyp File bearbeitet
2/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Arbeiten mit Files
Damit ein Programm mit externen Dateien arbeiten kann, müssen folgende Schritte ausgeführt werden:
• Für das File muss eine Filevariable deklariert sein
• Das File muss durch das Programm geschlossen werden
• Über die Filevariable wird in die Datei geschrieben oder aus der Datei gelesen
• Das File muss durch das Programm geöffnet werden
• Das File muss mit einem dem Betriebssystem bekannten, ev. noch zu kreierenden, Dateinamen in Verbindung gebracht werden
333
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Die Elemente eines Files
Filevariable Filekomponente
File: Eine verlängerbare Folgevon Filekomponenten
Positionszeiger der Filevariablen
1 Komponentennummer
4/33
• Permanente Datenspeicherung
• Deklaration von FilesDeklaration von Files
• Files verwenden
• Filetypen: Drei Kategorien
• Sequentielle Files
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Deklaration von Files
Deklaration einer Filevariablen
var
Eingabedaten: file of Integer;
5/33
Name der Filevariablen Basistyp
Ein in Pascal deklarierbarer Typ
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Deklaration von Files
Deklaration eines Filetyps
type
Messung =Real;
Messwerte = file of Messung;
6/33
Vom gleichen Typ
Nicht vom gleichen Typ
var
MWDatei_1 : Messwerte;
MWDatei_2 : Messwerte;
MWDatei_3 : file of Messung;
MWDatei_4 : file of Messung;
• Permanente Datenspeicherung
• Deklaration von Files
• Files verwendenFiles verwenden
• Filetypen: Drei Kategorien
• Sequentielle Files
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Zuordnung eines Files zu einer Datei
Mit der Prozedur AssignFile wird der Filevariablen ein (und nur ein) in einer Stringkonstanten oder -variablen angegebener Dateiname zugeordnet.
AssignFile(Eingabedaten,'C:\Messwerte')
Name der Filevariablen Verzeichnispfad und Dateiname
7/33
oder:
const
Filename = 'C:\Messwerte';
AssignFile(Eingabedaten, Filename);
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Zuordnung eines Files zu einer externen Datei mit OpenDialog
Unter Verwendung der Delphi-Komponente OpenDialog: können Dateinamen interaktiv eingegeben oder bestehende Dateinamen ausgewählt werden:
Nach drücken desButtons Öffnenkann der ausge-wählte Dateinameim Feld FileNameder KomponenteOpenDialoggelesen werden
AssignFile(Eingabedaten,OpenDialog1.FileName);
8/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Files zum Lesen oder Schreiben vorbereiten
Lese- oder Schreibzugriffe auf Filekomponenten sind erst möglich nachdem ein File geöffnet worden ist
Dazu stellt Pascal die Prozeduren
Reset und
Rewrite
zur Verfügung
In Delphi gibt es zusätzlich die Prozedur
Append um Text an Textfiles anzufügen
9/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Öffnen eines Files zum Lesen
Mit der Prozedur Reset wird das File für eine bereits vorhandene Datei geöffnet:
Reset(Eingabedaten);
• Ist das zu öffnende File bereits offen, wird es zuerst geschlossen und dann erneut geöffnet. Nach dem Öffnen wird der Positions-zeiger an den Anfang des Files gesetzt
• Ist keine Datei mit dem angegebenen Namen vorhanden, dann tritt ein Eingabe/Ausgabe-Fehler auf
10/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Lesen eines Files
Mit der Prozedur Read wird der Inhalt einer Filekomponente gelesen
var
Messwert: Real;
Eingabedaten: file of Real;
begin
AssignFile(Eingabedaten,'C:\Messwerte')
Reset(Eingabedaten);
Read(Eingabedaten, Messwert);
11/33
Filevariable Variable, in die gelesen wird
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Lesen eines Files
Beim Lesen eines Files muss geprüft werden, ob das Ende des Files erreicht wurde
Die Funktion EOF (End Of File) liefert "TRUE" sobald die letzte Filekomponente gelesen wurde
if NOT EOF(Eingabedaten)
then Read(Eingabedaten, Messwert);
12/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Öffnen eines Files zum Schreiben
Die Prozedur Rewrite erstellt ein neues File und öffnet es anschliessend:
Rewrite(MWDatei_1);
• Mit Rewrite wird ein File darauf vorbereitet, Daten in eine neue Datei unter dem mit AssignFile der Filevariablen (MWDatei_1) zugewiesenen Dateinamen zu schreiben
• Ein bereits offenes File wird zuerst geschlossen und dann erneut geöffnet. Nach dem Öffnen wird der Positionszeiger an den Anfang des Files gesetzt
• Existiert bereits eine gleichnamige Datei, wird deren Inhalt gelöscht und an ihrer Stelle die neue Datei angelegt
13/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Schreiben eines Files
Mit der Prozedur Write wird eine Filekomponente geschrieben
var
Messwert: Real;
Eingabedaten: file of Real;
begin
AssignFile(Eingabedaten,'C:\Messwerte')
Rewrite(Eingabedaten);
Messwert:= 12.87;
Write(Eingabedaten, Messwert);
14/33
Filevariable Variable, deren Wert geschrieben wird
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Schliessen eines Files
Mit der Prozedur CloseFile wird ein File geschlossen. Diese Operation stellt sicher, dass alle Daten in die Datei geschrieben werden
Nach CloseFile kann die Filevariable mit AssignFile einer anderen (oder nochmals der gleichen) Datei zugeordnet werden
AssignFile(Eingabedaten, 'C:\Messwerte');
Reset(Eingabedaten);
{ Datei Messwerte verarbeiten }
CloseFile(Eingabedaten);
AssignFile(Eingabedaten, 'A:\NeueWerte');
Reset(Eingabedaten);
{ Datei NeueWerte verarbeiten }
15/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Abfangen des Fehlers bei fehlenden Dateien
• Pascal überprüft standardmässig ob Aufrufe von Eingabe-/Ausgabe Prozeduren und -Funktionen zu Problemen geführt haben (E/A-Fehler)
• Beim Auftreten eines solchen Fehlers wird der Programmablauf in der Regel abgebrochen
• Die automatische Fehlerüberprüfung kann mit einer sog. Compiler-Direktive deaktiviert werden: {$I-}
Kommentar Compiler-Direktive Name Parameter
{ $ I - }
16/33
E/A-Fehler können so im eigenen Programm behandelt werden
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Abfangen des Fehlers bei fehlenden Dateien
Die Funktion IOResult liefert den Status der letzten E/A-Operation
Dazu muss die automatische E/A-Prüfung mit der Compiler-Direktiven {$I–} deaktiviert werden
AssignFile(Eingabedaten, 'C:\Messwerte'); {$I-} {E/A-Prüfung ausschalten}Reset(Eingabedaten);
{$I+} {E/A-Prüfung einschalten}if IOResult = 0 then begin {File wurde fehlerfrei geöffnet}
. . .end
else begin {File konnte nicht geöffnet werden}
17/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Zusammenfassung: Dateneingabe
A:\Meindok.txt
ch
Externer Speicher
Arbeitsspeicher
Read(Eingabe,ch);
1
2
3
AssignFile(Eingabe,'A:\Meindok.txt');
Reset(Eingabe);
Schritt 3 kann wiederholt werden bis das Ende des Files erreicht wird
Es soll eine Textdatei, Zeichen um Zeichen, eingelesen werden
Pascal-Anweisungen
18/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Zusammenfassung: Datenausgabe
A:\Meindok.txt
ch
Externer Speicher
ArbeitsspeicherWrite(Ausgabe,ch);
Rewrite(Ausgabe);
1
2
3
Pascal-Anweisungen
Es soll eine Textdatei, Zeichen um Zeichen, ausgeschriebenwerden
19/33
AssignFile(Ausgabe,'A:\Meindok.txt');
• Permanente Datenspeicherung
• Deklaration von Files
• Files verwenden
• Filetypen: Drei KategorienFiletypen: Drei Kategorien
• Sequentielle Files
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Drei Kategorien von Files
Pascal unterscheidet zwischen folgenden Filetypen:
• Typisierte Files
• Untypisierte Files
• Textfiles
20/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Typisierte Files
Die Filekomponenten sind von einem in Pascal deklarierbaren Typ
Beispiele
var
Messwerte: file of Real;
Beobachtung: file of Boolean;
Sequenz: file of Char;
Bezeichner Basistyp
21/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Untypisierte Files
Wird bei der Deklaration der Filevariablen kein Basistyp angegeben, dann speichert jede Filekomponente ein Byte
Verwendet für Zugriffe bei denen keine Voraussetzungen für Struktur und Inhalt der entsprechenden Dateien gemacht werden
Beispiel
var
Eingabedaten: file;
22/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles
Speichert zeilenweise angeordnete Textzeichen
var
Dokument: Textfile;
• Standardprozeduren und -funktionen:
AssignFile, Reset, Rewrite, Read, Write, CloseFile, EOF
• Read- und Write-Prozeduren erlauben das Lesen und Schreiben von Werten, die nicht den Typ Char haben
• Mit Reset geöffnete Textfiles sind schreibgeschützt
23/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles lesen
Jede Zeile in einem Textfile wird mit einem Zeilenende-Zeichen abgeschlossen
Dieses Zeichen muss auch gelesen werden
var
Dokument: Textfile;
Zeile: String;
Zeichen: Char;
begin
AssignFile(Dokument, 'C:\Meintext.txt');
Reset(Dokument);
Read(Dokument, Zeile);
Read(Dokument); {liest End of line}
24/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles lesen
Zur Vereinfachung stellt Pascal die Prozedur Readln (für Read Line) zur Verfügung
Statt
Read(Dokument, Zeile);
Read(Dokument);
können wir abgekürzt schreiben
Readln(Dokument, Zeile);
25/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles lesen
Die Standardfunktion EOLN (für End Of Line) liefert "TRUE" sobald das nächste zu lesende Zeichen ein Zeilenende-Zeichen ist
Somit können wir Zeilen unbekannter Länge lesen:
while not EOLN(Dokument) do
Read(Dokument, Zeichen);
Read(Dokument); {liest das Zeilenende-Zeichen}
26/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles lesen
• Aus Textfiles gelesene Zeichenfolgen, die ganze oder reelle Zahlen darstellen, werden automatisch in die entsprechenden numerischen Werte vom Typ Integer oder Real konvertiert
• Entspricht die Zahl nicht dem erwarteten Format, tritt ein E/A-Fehler auf
var
Dokument: Textfile;
Wert_1, Wert_2: Integer;
begin
Read(Dokument, Wert_1, Wert_2);
27/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Textfiles schreiben
• Akzeptiert werden Werte vom Typ Char, String, Boolean, einem Integer-Typ oder einem Real-Typ (automatische Konvertierung)
var
Dokument: Textfile;
Zeile: String; Wert: Real;
begin
Rewrite(Dokument);
Zeile:= 'ETH Zuerich');
Write(Dokument, Zeile);
Writeln;
Wert:= 37.85;
Writeln(Dokument, Wert);
28/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Text anfügen
Mit der Prozedur Append wird ein Textfile so für Schreibzugriffe geöffnet, dass die Daten am Ende des Files angefügt werden
Append(Dokument);
• Die Textfilevariable (Dokument) muss mit AssignFile einer Datei zugeordnet worden sein
• Der Positionszeiger wird auf das Fileende gesetzt
• Im Gegensatz zu Rewrite wird mit Append der Inhalt einer bestehenden Datei nicht gelöscht
• Ist das File bereits offen, wird es zuerst geschlossen und dann erneut geöffnet
29/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Text anfügen
var
Dokument: Textfile;
Zeile: String;
Leitzahl: Integer;
begin
Append(Dokument);
Zeile:= 'ETH ';
Leitzahl:= 8092;
Writeln(Dokument,Zeile,Leitzahl,' Zuerich');
30/33
• Permanente Datenspeicherung
• Lesen und schreiben in Pascal
• Filetypen: Drei Kategorien
• Arbeiten mit Files
• Sequentielle FilesSequentielle Files
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Schreiben einer sequentiellen Datei
AssignFile(F,'D')
Rewrite(F)
F D
DF
0
Write(F,V) F D
V 1
Schematische Darstellung
Write(F,V) F D
V 2
Vorsicht:Rewrite löscht den Inhalt einerbestehenden Datei!
31/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Lesen einer sequentiellen Datei
Schematische Darstellung
AssignFile(F,'D')
Reset(F)
F D
DF
0
Read(F,V) F D
V 1
Read(F,V) F
V 2
D
32/33
Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich
Lesen einer sequentiellen Datei
Schematische Darstellung
Read(F,V) F D
V n
Read(F,V) F
V n+1
D
Eine weitere Read-Anweisung würde zu einem Laufzeitfehler führen
EOF(F) = true
33/33