Pascal-Tutorial Kapitel 7


Aus Wirthi's Wiki

Wechseln zu: Navigation, Suche
Pascal-Tutorial
Allgemeines
Kapitel 1 (Einleitung)
Kapitel 2 (Daten)
Kapitel 3 (Anweisungen)
Kapitel 4 (Ein- und Ausgabe)
Kapitel 5 (Unterprogramme)
Kapitel 6 (Felder und Strukturen)
Kapitel 7 (Dateien)

Inhaltsverzeichnis

Im Kapitel 7 des Pascal-Tutorials behandeln lernen wir, Daten in Dateien zu schreiben und von dort zu lesen.

[bearbeiten] Dateiverarbeitung

Variablen im Arbeitsspeicher sind äußerst flexibel, sie haben nur einen großen Nachreil: sie "überleben" eine Programmbeendigung nicht. Wäre doch praktisch, wenn man Sie wo speichern könnte! Vielleicht in einer Datei auf der Festplatte ...

Unter Pascal Dateien anzusprechen ist sehr einfach. Mit einigen wenigen Befehlen können Sie schon Binär- und Textdateien verarbeiten, von ihnen lesen und in sie schreiben.

[bearbeiten] Öffnen einer Datei

Zuerst müssen Sie dem System die zu öffnende Datei bekannt geben. Das geschieht mit dem Befehl assign. Diese Anweisung erwartet zwei Parameter: ein sogenanntes "Datei-Handle" und einen Dateinamen inkl. Pfadangabe. Das Dateihandle ist eine Variable von Typ text (für Textdateien) oder von Typ "file of Typ", wobei "Typ" ein beliebiger Datentyp sein kann.

.....
VAR textDatei:text;
    intDatei:file of integer;
BEGIN
  assign(textDatei,'readme.txt');
  assign(intDatei,'A:\datei.dat');
.....

Die Anweisung ASSIGN verbindet einen Dateinamen mit einem sogenannten Handle. Dabei wird allerdings NICHT überprüft, ob die Datei existiert!

Bemerkung: Ein Dateihandle ist ein System-interner Name für eine Datei. Viele Betriebssystem speichern Informationen über die geöffneten Dateien intern in einem strukturierten Feld ab (Name der Datei, welches Programm darauf zugreift, ...). Um eine Datei öffnen zu können, muss man zuerst ein freies Array-Element "zugeteilt" bekommen, in dem die Infos über die Datei stehen werden. Dies geschieht mit dem Befehl assign. Das zurückgelieferte Datei-Handle ist im einfachsten Fall der Index der Datei innerhalb des Feldes. Dieses System erleichtert sowohl dem Programmierer des Betriebssystemes als auch Ihnen die Arbeit!

Nach der Ausführung von assign können Sie die Datei öffnen. Dazu müssen Sie einen der beiden Befehle reset oder rewrite ausführen. Beide verlangen als Parameter ein Dateihandle. reset öffnet die Datei; gibt es die Datei nicht, erhalten Sie eine Fehlermeldung. Bei einer noch nicht existierenden Datei müssen Sie rewrite verwenden. Dieser Befehl öffnet ebenfalls die Datei. Wenn sie schon besteht wird sie gnadenlos überschrieben; existiert sie noch nicht, wird sie neu angelegt.

[bearbeiten] Schließen einer Datei

Wenn Sie alle Schreib- und Leseoperationen beendet haben, sollten Sie die Datei schließen. Dies ist wichtig, um sicherzustellen, das sich Daten nicht noch in einem System-Puffer befinden, sondern dass wirklich alle Daten in die Datei geschrieben wurden.

Die Anwendung ist einfach: close(Dateihandle);. Das Beispiel dazu finden Sie etwas weiter unten ("Lesen einer Datei").

[bearbeiten] Schreiben in eine Datei

ACHTUNG: Passen Sie auf, in welche Datei Sie schreiben! Pascal überschreibt (falls Sie es befehlen) gnadenlos Systemdateien (sofern das Betriebssystem das zulässt), ihre Lieblingsgrafik oder die EXE-Datei der Textverarbeitung. Unbedingt aufpassen!

Egal, ob Sie jetzt mit einer binären oder mit einer textuellen Datei arbeiten, können Sie mit der Anweisung write(ln) Werte in die Datei schreiben. Erinnern Sie sich noch an den Abschnitt über Drucker? Dort mussten Sie bei einer Ausgabe auf den Drucker als ersten Parameter "lst" angeben. Na, können Sie sich schon vorstellen, was das war? Könnte das vielleicht so eine Art Handle gewesen sein? Ja, es ist so. Wollen Sie also in eine Datei schreiben, geben Sie als ersten Parameter das Dateihandle an. Als weitere Parameter geben Sie dem Datentyp des Dateihandels entsprechende Ausdrücke an, die Sie in die Datei schreiben möchten.

Dabei müssen Sie auf eines achten: Wenn Sie in eine Datei lauter integer-Zahlen speichern, diese Datei schließen, als char-Datei wieder öffnen und auslesen, bekommen Sie lauter mehr oder weniger zufällig gereihte ASCII-Zeichen. Eine binäre integer-Datei sollte also immer nur als solche gelesen und geschrieben werden, und nicht als char oder gar text-Datei geöffnet werden.

Bei einer Textdatei sind Sie nicht an Datentypen gebunden. Wenn Sie in eine Textdatei die Zahl "12345" speichern, wird diese nicht als 2-Byte-Integer dort gespeichert, sondern als die ASCII-Zeichen "1", "2", "3", "4" und "5". Danach können Sie einen String, eine Byte-Zahl, etc. speichern. Sie müssen nur aufpassen, dass die Werte (Datentypen) in der selben Reihenfolge wieder ausgelesen werden, sonst wird der String als Zahl und die Zahl als Wahrheitswert interpretiert, mit ungeahnten Folgen.

program schreibeIntegerDatei;
uses crt;
var i:integer;
    datei:file of integer;
begin
  assign(datei,'text.dat');
  rewrite(datei);

  for i:= 1 to 10 do 
  begin
    write(datei,i);
  end;
  close(datei);
end.
Beschreibung
  • Es werden alle Zahlen von 1 bis 10 binär in die Datei geschrieben. Ersetzten Sie in dem Beispiel ruhig einmal das "file of integer" durch "text", und schreiben Sie in eine andere Datei (zB. "text2.txt"). Dann vergleichen Sie mit einem Text- oder Hexeditor die beiden Dateien.

[bearbeiten] Lesen aus der Datei

Mit der bekannten read(ln) Anweisung können Sie Daten aus einer Datei lesen. Am besten sieht man das im folgenden Beispiel:

program leseIntegerDatei;
uses crt;
var i,zahl:integer;
    datei:file of integer;
begin
  assign(datei,'text.dat');
  reset(datei);

  clrscr;
  for i:= 1 to 10 do 
  begin
    read(datei,zahl);
    write('Der ',i,'. Wert ist: ',zahl);
  end;
  close(datei);
end.

Die vorher gespeicherten Zahlen werden wieder gelesen und ausgegeben. Falls Sie Interesse daran haben, können Sie die "file of integer" in beiden Programmen gegen "text" austauschen, und die erzeugten Dateien der beiden Versionen vergleichen. Bei der text-Variante sollte das Ergebnis lesbar sein, für die file of integer-Version brauchen Sie schon einen Hex-Editor, um sinnvolle Werte darin zu erkennen.

Ich möchte nochmals darauf hinweisen, dass es nicht sehr sinnvoll ist, aus einer Datei binär Daten zu lesen, wenn diese mittels "text" hineingeschrieben wurden. Es ist zwar durchaus möglich, aber die Werte die Sie herauslesen sind dann nicht die selben die Sie hineingeschrieben haben.

[bearbeiten] Das Ende?

Sie sind jetzt am Ende dieses Tutorials angekommen. Doch der Spaß hat erst begonnen. Es gibt so viele Möglichkeiten, von denen Sie in diesem Tutorial noch nichts gehört haben: Grafik, Units selber schreiben, Hardware-Programmierung, und vieles mehr. Doch mit dem hier vermittelten Wissen ist es nicht mehr weit, bis Sie umfangreiche Programme schreiben können. Was Sie dazu brauchen, ist vermutlich die Pascal-Hilfedatei ihres Compilers, und etwas Mut, neue Dinge auszuprobieren.

Nehmen Sie sich doch bitte jetzt etwas Zeit, mir etwas Feedback zukommen zu lassen. Adressen finden Sie unter Christian Wirth.

Pascal-Tutorial: Allgemeines - Kapitel 1 - Kapitel 2 - Kapitel 3 - Kapitel 4 - Kapitel 5 - Kapitel 6 - Kapitel 7

Persönliche Werkzeuge