Zur Wiederholung:
Bei der Deklaration einer Variablen muß stets ein Datentyp für diese angegeben werden. Unter Turbo Pascal gibt es verschiedene Datentypen, z.B.:
Abbildung in dieser Leseprobe nicht enthalten
Soll ein String keine 255 Zeichen beinhalten, sondern weniger, kann man die maximale Länge in [eckigen] Klammern angeben. Beispiel:
Abbildung in dieser Leseprobe nicht enthalten
Der Datentyp Record
Nun kann man auch verschiedene Datentypen zu einem einzigen Typen kombinieren. Diese kombinierten Felder heißen Record. Record-Datentypen werden in einem Type-Abschnitt, der vor dem Var-Abschnitt steht, definiert:
Abbildung in dieser Leseprobe nicht enthalten
Man kann nun eine Variable vom Typ „Datensatz“ im Var-Abschnitt deklarieren:
Abbildung in dieser Leseprobe nicht enthalten
Ist „Person“ nun als Variable vom Typ Adresse deklariert, kann man die einzelnen Felder wie folgt ansprechen: Person.Tel, Person.Name, Person.ProblemNr, ...
Hier ein Beispiel für ein Programm:
Abbildung in dieser Leseprobe nicht enthalten
Sind in einem Programmstück viele Zugriffe auf die Felder einer Record-Variable erforderlich, so läßt sich das mit der WITH-Anweisung vereinfachen. Man erspart sich also die ständige Angabe des Präfixes „Person.“:
Abbildung in dieser Leseprobe nicht enthalten
Arbeiten mit Dateien
Eine Datei ist gemäß Definition die „Bezeichnung für eine nach bestimmten Gesichts- punkten zusammengestellte Menge an Daten.“ (Duden Informatik). Für Pascal ist also auch der Bildschirm nur eine Datei. In diese „Datei“ kann Pascal Schreiben (mit dem Befehl WRITE) und Lesen (mit READ) wie aus jeder anderen Datei auch.
Uns geht es an dieser Stelle aber um Dateien, die auf einem Medium (Festplatte, Diskette, CD) liegen.
Pascal benötigt eine sogenanntes „ File-Handle “ um mit einer Datei zu arbeiten. Das ist eine Variable, die von dem speziell für diesen Zweck geschaffenen Typen FILE sein muß1. Dahinter muß angegeben werden, von welchem Typ die Daten sind, die in die Datei gespeichert werden soll. Die Deklaration für eine Datei, in die Integer- Zahlenwerte geschrieben werden sollen, könnte somit wie folgt aussehen:
Abbildung in dieser Leseprobe nicht enthalten
Bevor auf die Datei zugegriffen wird, muß sie geöffnet werden. Dies geschiet in Pascal in zwei Schritten: zunächst muß eine Verbindung zwischen der Dateivariablen und dem Dateinamen hergestellt werden (mit dem Befehl ASSIGN):
Abbildung in dieser Leseprobe nicht enthalten
Danach muß dem Betriebssystem MS-DOS mitgeteilt werden, daß im folgenden Zugriffe auf die Datei erfolgen sollen. Das wird mit den Befehlen REWRITE oder RESET realisiert.
REWRITE (Handle);
Öffnet die Datei so, daß anschließend Daten hineingeschrieben werden können. Existiert bereits eine Datei mit dem gleichen Namen, wird sie vorher gelöscht (!). Existiert noch keine Datei mit diesem Namen, wird eine leere Datei erstellt.
RESET (Handle);
Öffnet eine bestehende Datei ohne sie zu löschen. Besteht die Datei vorher noch nicht, gibt es eine Fehlermeldung und das Programm wird beendet.
Die Generierung dieser Fehlermeldung kann durch einen sogenannten Compilerbefehl unterdrückt werden. Vom Programmierer kann dann in der pascaleigenen Variable IOResult abgefragt werden, ob das Öffnen der Datei mit RESET erfolgreich war. Der Befehl lautet $I- zum Ausschalten der Fehlergenerierung durch den Compiler und $I+ um sie wieder anzuschalten, was sicherhaltshalber nicht vergessen werden sollte. Dabei ist zu beachten, daß Compilerbefehle2 immer in {geschweiften} Klammern stehen müssen.
Ein Programm also, das eine bestehende Datei öffnet ohne sie zu löschen und in dem Fall, daß die Datei noch nicht besteht eine neue erstellt, könnte wie folgt aussehen:
Abbildung in dieser Leseprobe nicht enthalten
Der CLOSE-Befehl schließt die geöffnete Datei wieder. Er muß unbedingt aufgerufen werden, bevor das Programm beendet wird, ansonsten können Daten unvorhersehbar verloren gehen und die Datei kann fehlerhaft sein.
Wie arbeitet man nun mit einer geöffneten Datei?
Ganz einfach werden die Daten mit
Abbildung in dieser Leseprobe nicht enthalten
in die Datei geschrieben und mit
Abbildung in dieser Leseprobe nicht enthalten
Die Daten werden immer an die Position geschrieben bzw. von der Position gelesen, an der der Dateizeiger momentant steht. Zur Veranschaulichung hier ein Beispiel einer Datei in die die 4 Zeichenketten „Bart“, „Lisa“, „Marge“ und „Homer“ geschrieben wurden:
Abbildung in dieser Leseprobe nicht enthalten
Wobei Position 4 noch nicht existiert / leer ist
Wie gesehen liefert die Funktion FILESIZE(Handle) die Größe der Datei zurück (Wert vom Typ LongInt). Die Größe wird als die Anzahl der Datensätze, die in der Datei gespeichert sind, definiert. Die entspricht i.d.R. nicht der von MS-DOS angegeben Größe in Bytes.
Die Funktion FILEPOS(Handle) gibt nun die Position des Dateizeigers an.
Würde z.B. der Wert 2 geliefert, würde bei der nächsten READ-Anweisung die Zeichenkette „Marge“ gelesen.
Der Dateizeiger wird nach einem Zugriff von READ oder WRITE automatisch um 1 erhöht.
Nach dem Einlesen von „Marge“ steht der Dateizeiger also auf 3. Ein READ-Befehl würde uns nun „Homer“ liefern. Danach steht der Dateizeiger auf 4 und das Dateiende ist erreicht (d.h. FILEPOS (Handle) = FILESIZE(Handle) ). Wenn jetzt ein READ-Befehl gemacht wird, liefert das Programm eine Fehlermeldung. Stattdessen können nun mit WRITE neue Datensätze angehängt werden.
Achtung: Nach dem Öffnen einer Datei mit REWRITE oder RESET steht der Dateizeiger stets auf Null.
Mit dem Befehl SEEK(Handle, Position) wird der Dateizeiger auf den Datensatz mit dem Index „Position“ gesetzt. Mit
SEEK(Handle, FILESIZE(Handle))
springt man demnach an das Ende der Datei und man kann neue Datensätze anhängen.
Abbildung in dieser Leseprobe nicht enthalten
[...]
1 Es gibt auch noch den Typ „TEXT“ für Textdateien, auf den ich aber nicht weiter eingehe
Häufig gestellte Fragen
Was ist der Datentyp Record in Turbo Pascal?
Der Datentyp Record erlaubt es, verschiedene Datentypen zu einem einzigen Typen zu kombinieren. Diese kombinierten Felder werden als Record bezeichnet. Records werden in einem Type-Abschnitt vor dem Var-Abschnitt definiert.
Wie deklariert man eine Variable vom Typ Record?
Zuerst muss ein Record-Datentyp im Type-Abschnitt definiert werden, der die einzelnen Felder und deren Datentypen festlegt. Dann kann eine Variable von diesem Typ im Var-Abschnitt deklariert werden. Zum Beispiel:
type
Adresse = record
Name: string[30];
Tel: string[15];
ProblemNr: integer;
end;
var
Person: Adresse;
Wie greift man auf die Felder eines Record zu?
Man greift auf die einzelnen Felder eines Record zu, indem man den Variablennamen, gefolgt von einem Punkt und dem Feldnamen angibt. Zum Beispiel: Person.Tel
, Person.Name
, Person.ProblemNr
.
Was ist die WITH-Anweisung und wofür wird sie verwendet?
Die WITH-Anweisung vereinfacht den Zugriff auf die Felder einer Record-Variable, wenn in einem Programmstück viele Zugriffe auf diese Felder erforderlich sind. Sie erspart die ständige Angabe des Präfixes (z.B. "Person.").
Was ist ein File-Handle in Pascal?
Ein File-Handle ist eine Variable vom Typ FILE, die Pascal benötigt, um mit einer Datei zu arbeiten. Es stellt eine Verbindung zwischen der Dateivariablen und der physischen Datei auf dem Datenträger her.
Wie öffnet man eine Datei in Pascal?
Eine Datei wird in Pascal in zwei Schritten geöffnet: zuerst wird eine Verbindung zwischen der Dateivariablen und dem Dateinamen mit dem Befehl ASSIGN hergestellt. Danach wird dem Betriebssystem mit den Befehlen REWRITE oder RESET mitgeteilt, dass Zugriffe auf die Datei erfolgen sollen.
Was ist der Unterschied zwischen REWRITE und RESET?
REWRITE öffnet die Datei zum Schreiben. Wenn bereits eine Datei mit dem gleichen Namen existiert, wird sie gelöscht. Wenn keine existiert, wird eine neue leere Datei erstellt. RESET öffnet eine bestehende Datei, ohne sie zu löschen. Wenn die Datei nicht existiert, gibt es eine Fehlermeldung.
Was ist der Compilerbefehl $I- und $I+?
$I- schaltet die Fehlergenerierung durch den Compiler aus, wenn eine Datei mit RESET nicht geöffnet werden kann. $I+ schaltet die Fehlergenerierung wieder ein.
Warum sollte man den CLOSE-Befehl verwenden?
Der CLOSE-Befehl schließt die geöffnete Datei wieder. Er muss unbedingt aufgerufen werden, bevor das Programm beendet wird, ansonsten können Daten verloren gehen und die Datei kann fehlerhaft sein.
Wie schreibt und liest man Daten in eine Datei?
Daten werden mit dem Befehl WRITE(Handle, Variable) in die Datei geschrieben und mit READ(Handle, Variable) aus der Datei gelesen.
Was ist der Dateizeiger?
Der Dateizeiger ist eine interne Positionsmarkierung innerhalb einer Datei. Die Daten werden immer an der Position geschrieben bzw. von der Position gelesen, an der der Dateizeiger momentan steht. Nach einem READ oder WRITE wird der Dateizeiger automatisch um 1 erhöht.
Was liefern die Funktionen FILESIZE und FILEPOS?
FILESIZE(Handle) liefert die Größe der Datei zurück (als Anzahl der Datensätze). FILEPOS(Handle) gibt die aktuelle Position des Dateizeigers an.
Wie bewegt man den Dateizeiger an eine bestimmte Position?
Mit dem Befehl SEEK(Handle, Position) wird der Dateizeiger auf den Datensatz mit dem Index "Position" gesetzt.
- Arbeit zitieren
- Anne Timte (Autor:in), 1999, Dateiverarbeitung mit Turbo Pascal, München, GRIN Verlag, https://www.grin.com/document/96619