Turbo Pascal - Teil 6


Dateiverwaltung und -bearbeitung mit Turbo Pascal!
========================================

Wie ist eine Datei aufgebaut?
------------------------------------------

Um eine Datei erzeugen zu können, muß man sich zunächst über die Bestandteile einer solchen im Klaren sein.
In folgende Bestandteile kann eine Datei gegliedert werden :

~ Dateiname
~ Dateiextension
~ Struktur und Inhalt

Der Dateiname:

Je nach dem welche Funktion eine Datei hat, ist der Name vom Entwickler festgelegt oder kann vom User eingegeben werden.

Die Dateiextension:

Dieser Bestandteil gibt in der Regel Aufschluß über Zweck,Verwendung und Herkunft der Datei.
In den meisten Programmiersprachen ist es möglich, dem User die Wahl der Extension zu überlaßen. Allerdins würde ich empfehlen dem Endanwender in dieser Hinsicht einzuschränken, da einige Extensionen vom Betriebsystem feste funktionalle Eigenschaften zugewiesen bekommen. So wäre es falsch eine Textdatei die EXE-Extension anzuhängen.
Denn wie Sie vielleicht wissen indiziert diese Dateiendung ein seblstlaufendes Programm, was allerdings bei der Textdatei nicht der Fall ist.

Hier wird deutlich, daß man Dateien in zwei Grundtypen differenziert : Zum einen gibt es die selbstlausführenden Dateien, welche für eine Öffnung keine weiteren Programme benötigen. Und zum anderen braucht beispielsweise eine Bilddatei ein zB Bildbearbeitungsprogramm zur Anzeige.

!! Tip !!

Wählen Sie die Dateiendungen möglichst logisch aus, so daß sie die Charistika erfüllt (Information zu Art und Herkunft). Wenn Sie beispielsweise eine Textverarbeitung geschrieben haben, so könnten Sie die folgenden Endungen benutzen : *.txt ; *.wri .
Oder aber Sie kombinieren aus den Namen des Programmes die Extension. Wenn also das Programm "SuperTexter" hieße, so wären folgende Kombinationen möglich : *.ste; *.sut; *.stx .

Struktur und Inhalt einer Datei:

Das wichtigste bei der Dateierzeugung ist die Angabe der Dateistruktur. Denn nicht jede Datei hat den gleichen Aufbau.

Bei der Dateiarbeit mit Turbo Pascal hat man die Möglichkeit drei Arten einer Datei zu erzeugen :

~ Typisierte Dateien, besitzen eine eindeutige Struktur.
Sie können sich diese Dateien als ein liniertes Blatt vorstellen, auf denen Sie bestimmen, was in jede Linie geschrieben wird.
Wenn Sie beispielsweise eine Highscore erzeugen möchten, so würden Sie in jeder Linie den Spielernamen und dessen erreichte Punktzahl schreiben. Somit haben Sie also eine Struktur für die Datei definiert.
Hierbei gilt es zu beachten, dass eine Datei nicht nur aus einen Eintrag bestehen muß, denn wie das Blatt Linien hat, so kann sie mehrere Datensätze enthalten.
Wichtig ist ebenfalls, dass die Datensätze einer Datei zwar die gleiche Struktur , aber nicht die gleichen Informationen haben.

~ Textdateien, sind vordefinierte typisierte Dateien. Die Struktur ihrer Datensätze besteht aus einen Array des Typs CHAR.

~ Untypisierte Dateien, haben keine klare Struktur.


Praktische Umsetzung :
---------------------------------

Im folgenden lernen Sie, wei man typisierte Dateien erzeugt und bearbeiten kann.
Als Beispiel wird die Erstellung einer Highscore genutzt.

Bei der Dateierarbeit müßen Sie folgende drei Schritte nacheinander bearbeiten.

1.) Datei öffnen
2.) Datei bearbeiten,umschreiben,neuschreiben
3.) Datei schließen

Bevor Sie diese Schritte jedoch einleiten können müßen Sie die Dateistruktur festlegen.
Mit Hilfe des Schlüßelwortes "TYPE" ist dies möglich :


Type Struktur = record;
            Spielername : string[100];
            Punktzahl       : integer;
            end;
Nun muß nur noch eine Dateivariable vereinbart werden und ein Großteil der Vorarbeit ist erledigt.


VAR Datei : File of Struktur;

"File of" indiziert, daß die Variable "Datei" eine Datei mit dem Aufbau von Struktur ist.
Es wird also der logische Name der Datei definiert.

Sie brauchen jetzt noch Variable für den Datensatz.


VAR Satz : Struktur;

Wichtig ist, dass die Datensatzvariable vom gleichen Datentyp ist, wie der logische Name.

Wenn Sie nun eine neue Dateierzeugen möchten, müßen Sie zunächst den physischen Namen der Datei mit den Logischen verbunden werden.
Der physische Name ist der Name unter dem die Datei gespeichert wird.
Mit Hilfe der ASSIGN-Anweisung wird das realisiert.


ASSIGN(Datei,'Liste.sco');

Tritt nun im Programm die Variable "Datei" auf, so weiß der Rechner, daß damit die Datei "Liste.sco" gemeint ist.
Soll nun die Datei "Liste.sco" angelegt werden, so verwendet man die REWRITE-Anweisung.


ASSIGN(Datei,'Liste.sco');
REWRITE(Datei);

Die REWRITE-Anweisung legt also eine Datei auf einen Datenträger an und überschreibt, falls vorhanden, eine namensgleiche Datei.

Öffnung einer Datei
---------------------------

Ist die Datei schon vorhanden, so braucht sie natürlich nicht mehr erzeugt zu werden.
Man muß sie lediglich durch die RESET-Anweisung öffnen lassen.


ASSIGN(Datei,'Liste.sco');
RESET(Datei);

Jetzt muß man die oder den Datensatz einlesen, damit man dessen Daten auf dem Monitor ausgeben kann.


READ(Datei,Satz);

Wenn Sie jetzt die Informationen ausgeben möchten, verwenden Sie einfach die Variablen, welche in "Struktur" festgelegt wurden. Diese Variablen stehen aber nun in Abhängigkeit von "Satz".


WRITE(Satz.Spielername);
WRITELN(Satz.Punktzahl);

Da man aber nicht immer weiß wieviel Datensätze die Datei hat, kann man diese mit Hilfe der EOF-Anweisung bis zum letzten Satz auslesen lassen.
Nämlich dann, wenn man die Anweisung als Schleifenbedingung setzt.


WHILE NOT EOF(Datei) DO
BEGIN
           READ(Datei,Satz);
           WRITE(Satz.Spielername);
           WRITELN(Satz.Punktzahl);
END;

Übrigens : EOF steht für End Of File !

Wenn Sie aber nur bestimmte Datensätze auslesen möchten, haben Sie die Möglichkeit, das mit der SEEK-Anweisung zu tuen.
Angenommen Sie möchten den zweiten Datensatz einer Datei ansprechen, dann würde das folgendermaßen aussehen :


SEEK(Datei,2);

Dadurch setzen Sie den Zeiger, welcher auf den aktuellen Datensatz zeigt, manipulieren.
Allerdings müßen Sie beachten das nicht alle Rechner von 1 bis sonstwo zählen, sondern auch von 0 beginnen können.

Speichern einer Datei:
--------------------------------

Zunächst muß die Datei angelegt werden, dass haben Sie ja schon gelernt .


ASSIGN(Datei,'Liste.sco');
REWRITE(Datei);

Nun müßen die Daten eingelesen werden, welche gespeichert werden soll.


READLN(Satz.Spielername);
READLN(Satz.Punktzahl);

Jetzt speichern Sie die Daten in der Datei, indem Sie die WRITE-Anweisung verwenden.


WRITE(Datei,Satz);

Da Sie vielleicht mehrere Datensätze in der Datei einlesen, können Sie abermals eine Schleife benutzen.


REPEAT
READLN(Satz.Spielername);
READLN(Satz.Punktzahl);
WRITE(Datei);
WRITE('Weitere Datensätze eingeben ? [ n / j ] ');
READLN(Taste);
UNTIL Taste = 'n';

Bei diesem Beispiel kann man also solange Datensätze in die Datei schreiben bis man die Anfrage mit der Taste 'n' bestätigt.

Schließen einer Datei:
--------------------------------

Ist die Datei geöffnet, kann man sie bearbeiten, danach muß diese wieder geschloßen werden, da sonst wichtige Daten verloren gehen können.


CLOSE(Datei);

Als Entwickler sollten Sie darauf achten, die Dateien vor dem Beenden des Programmers wieder zu schließen, um Datenverluste zu vermeiden.

Löschen einer Datei:
------------------------------

Es ist hin und wieder notwendig eine Datei zu löschen. Unter Turbo Pascal können Sie das mit der ERASE-Anweisung fertigkriegen.

ERASE(Datei);

Umbennen einer Datei:
---------------------------------

Das Umbenennen einer Datei funktioniert genauso einfach, wie das Schließen oder Löschen der selbigen.


RENAME(Datei);

Wichtig ist jedoch, das beim Löschen und Umbennen die Datei geschloßen ist !



Anhang
-----------

Im folgenden erhalten Sie noch einen Überblick einiger wichtiger Befehle, welche für die Dateibearbeitung unter Turbo Pascal sehr hilfreich sind. Den Syntax der angebenen Befehle können Sie ggf. mit Hilfe des Hilfeindex von Turbo Pascal in Erfahrung bringen.

Befehle für die Arbeit mit Textdateien :
APPENDDatei zum Anfügen öffnen
EOLNPrüft, ob das Zeilenende erreicht ist
EOFPrüft, ob das Dateiende erreicht ist
FLUSHSchreibt Daten in den Puffer
READLiest die angegebene Datei ein
READLNLiest die angegebene Datei ein
SEEKEOFPrüft, ob zwischen dem aktuellen Datenzeiger und dem Dateiende noch Daten existieren
SEEKEOLNPrüft, ob zwischen dem aktuellen Dateizeiger und dem Zeilenende noch Daten existieren
SETTEXTBUFZuordnung E/A-Puffer
WRITESchreibt Daten in die angegebene Datei
WRITELNSchreibt Daten in die angegebene Datei
Ein- und Ausgabe untypisierter Dateien :
BLOCKREADLiest einen Block ein
BLOCKWRITESchreibt Daten in einen Block
Ein- und Ausgabe typisierter und untypisierter Dateien :
FILEPOSGibt die aktuelle Position des Datensatzzeigers zurück
FILESIZELiefert die Dateigröße zurück
SEEKManipuliert den Datensatzzeiger einer Datei
TRUNCATESchneidet die Datei an der aktuellen Position ab
Befehle mit Wirkung auf alle Dateien :
ASSIGNEine Variable wird der Datei zugewiesen
CHDIRVerzeichnis wechseln
CLOSEDatei schließen
ERASEDatei löschen
GETDIRLiest das aktuelle Verzeichnis ein
IORESULTStatus der letzten E/A-Operation
MKDIRVerzeichnis erstellen
RENAMEDatei umbenennen
RESETDatei zum Lesen öffnen
REWRITEDatei erzeugen oder überschreiben
RMDIRVerzeichnis löschen


Turbo Pascal Teil 5 | Inhalt | Turbo Pascal Spezial