Programmiersprache Pascal

Textdateien

Textdateien enthalten eine beliebig lange Folge von Zeichen, die zeilenweise angeordnet sind.
Typischerweise besitzen die Zeilen eine unterschiedliche Länge. Eventuell ist die Zeilenlänge begrenzt.

Textdateien können nur sequentiell gelesen werden.

Für Textdateien sieht Pascal den Datentyp TEXT und eine Reihe von vordefinierten Unterprogrammen vor.
Während einige Unterprogramme (Read, Readln, Write, Writeln, Eof, Eoln) über alle Pascal-Versionen hinweg weitgehend einheitlich verwendet werden, gibt es bei anderen (z.B. zur Dateieröffnung) eine Reihe von Systemabhängigkeiten.
Einige Systeme (z.B. Turbo Pascal, Delphi) realisieren nicht alle in Standard Pascal vorgesehen Routinen (z.B. Get, Put).

Bemerkung:
Dateien, die ausschließlich Text enthalten, können natürlich auch als Binärdatei behandelt werden.
Dies ermöglicht einerseits direktere Zugriffe, erschwert aber andere Operationen, da die Zeilenstruktur nicht mehr in einfacher Weise ausgenutzt werden kann.

  VAR f1 : TEXT;              { Textdatei }
      f2 : FILE OF CHAR;      { Binärdatei }
Der Umgang mit f1 und f2 unterscheidet sich zum Teil beträchtlich, auch wenn beide an die gleiche Datei gebunden werden.
(Dies ist nacheinander, jedoch nicht gleichzeitig möglich !)

Standard Pascal

Deklaration einer Dateivariablen

  VAR f : TEXT;
f steht hier als Bezeichner für eine Dateivariable.
TEXT ist ein vordefinierter Datentyp.

Turbo Pascal

Deklaration einer Dateivariablen

  VAR f : TEXT;
  VAR f : TEXTFILE;       { zusätzlich in Delphi }
f steht hier als Bezeichner für eine Dateivariable.
TEXT ist ein vordefinierter Datentyp.
In Delphi kann alternativ TEXTFILE benutzt werden, da für TEXT wie auch für einige andere Bezeichner weitere Verwendungszwecke gefunden wurden.

Bindung der Dateivariablen an einen Dateinamen

  Assign(f, dateiname);
  AssignFile(f, dateiname);            { zusätzlich in Delphi }
f ist eine Dateivariable, dateiname eine Zeichenkette, die den Namen einer Datei benennt.
dateiname muß den Konventionen des Betriebssystems entsprechen.
Der Aufruf von Assign löst keinen Zugriff auf das Dateisystem aus.
Assign ist eine vordefinierte Prozedur.

Nach der Bindung von f an den Dateinamen richten sich alle weiteren Operationen, die auf f Bezug nehmen, solange an die benannte Datei, bis f durch einen weiteren Aufruf von Assign eine andere externe Datei zugeordnet wird.

Wird für dateiname die leere Zeichenkette angegeben, so erfolgt in Abhängigkeit von der verwendeten Eröffnungsprozedur die Bindung an die Standardeingabe stdin bzw. die Standardausgabe stdout.

Eine Datei darf zur gleichen Zeit nicht mehrfach geöffnet sein.

Eröffnen einer Datei zum Lesen

  Reset(f);
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß.
Die bezeichnete Datei muß existieren. Dies wird durch Zugriff auf das Dateisystem geprüft.
Der Positionszeiger zeigt auf den Dateianfang.
Reset ist eine vordefinierte Prozedur.

Eröffnen einer Datei zum Schreiben (Überschreiben)

  Rewrite(f);
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß.
Existiert eine Datei mit dem angegebenen Namen, so wird sie überschrieben, andernfalls wird sie neu erstellt.
Der Positionszeiger zeigt auf den Dateianfang.
Rewrite ist eine vordefinierte Prozedur.

Eröffnen einer Datei zum Schreiben (Anfügen)

  Append(f);
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß.
Der Positionszeiger zeigt auf das Dateiende.
Append ist eine vordefinierte Prozedur.

Abfrage des Positionszeigers

  Eof(f);             { Dateiende ? }
  Eoln(f);            { Zeilenende ? }
Eof und Eoln sind vordefinierte Funktionen, die einen Wert vom Typ BOOLEAN liefern.
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß. Die Datei muß geöffnet sein.
Eof (end of file) prüft, ob der Positionszeiger auf dem Dateiende steht.
Eoln (end of line) ermittelt, ob der Positionszeiger auf einem Zeilenende steht.

Lesen aus einer Textdatei

  Readln(f, var_1, ..., var_n);
  Read(f, var_1, ..., var_n);
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß. Die Datei muß geöffnet sein.
var_1, ..., var_n ist eine variable Anzahl von Variablen.
Aus der Datei werden soviele Zeichen gelesen, wie zur Belegung der Variablen mit Werten erforderlich sind. Gelesen wird nur in einer Zeile.
Bei Read steht nach Abschluß der Eingabe der Positionszeiger auf dem Zeichen, an dem die Eingabe beendet wurde. Readln setzt den Positionszeiger auf den Anfang der nächsten Zeile.
Der Aufruf Readln(f) bewirkt das Überlesen einer Zeile aus der an f gebundenen Datei.
Bei der interaktiven Eingabe von Daten sollte stets Readln benutzt werden.

Schreiben in eine Textdatei

  Writeln(f, var_1, ..., var_n);
  Write(f, var_1, ..., var_n);
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß. Die Datei muß geöffnet sein.
var_1, ..., var_n ist eine variable Anzahl von Variablen bzw. Ausdrücken. Folgende Datentyp(klassen) sind möglich: Integer, Real, Boolean, Char, String.
In die Datei werden soviele Zeichen geschrieben, wie durch die angegebenen Variablen bestimmt. Der Positionszeiger steht auf dem Dateiende.
Writeln nimmt nach Abschluß der Ausgabe einen Zeilenwechsel vor, Write nicht.
Writeln(f) bewirkt die Ausgabe einer Leerzeile.

var kann eine Formatierungsangabe nachgestellt werden:

  var:w
  var:w:d
w ist eine ganze Zahl und gibt an, wieviele Zeichen ausgegeben werden sollen. Die Angabe wird ignoriert, wenn zur Ausgabe des Wert mehr Zeichen als angegeben benötigt werden.
d ist eine ganze Zahl und gibt für reelle Zahlen an, wieviele Nachkommastellen angegeben werden sollen.

Die Ausgabe erfolgt gepuffert: Jede geöffnete Datei verfügt über einen Dateipuffer.
Daten werden erst dann in das Dateisystem übertragen, wenn der Puffer voll ist bzw. wenn das Ausschreiben des Puffers erzwungen wird. Dies kann mit Hilfe der folgenden Prozedur erfolgen:

  Flush(f);
Die Größe des Dateipuffers (Standard: 128 Byte) kann bei Bedarf mit Hilfe der Prozedur SetTextBuf verändert werden.

Schließen der Datei

  Close(f);
  CloseFile(f);          { zusätzlich in Delphi }
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß.
Auf die geschlossene Datei sind keine weiteren Operationen möglich, solange sie nicht erneut eröffnet wird.
Vor dem Schließen wird automatisch der Dateipuffer geleert.
Achtung:
Wird das Programm beendet, ohne das zuvor alle geöffneten Dateien explizit geschlossen wurden, so gehen unter gewissen Umständen die ausgegeben Daten verloren !

Weitere Operationen mit Dateien

  Erase(f);                   { Datei löschen }
  Rename(f, neuer_name);      { Datei umbenennen }
f ist eine Dateivariable, die an einen Dateinamen gebunden sein muß.
f muß auf eine externe Datei verweisen, die zum Zeitpunkt der Ausführung der obigen Operationen nicht geöffnet sein darf.


Extended Pascal

Aufgeführt werden hier lediglich einige Abweichungen im Vergleich zu Turbo Pascal.

Die Bindung der Dateivariablen an einen Dateinamen und das Eröffnen der betreffenden Datei kann in einem Schritt erfolgen:

  Reset(f, dateiname);     { Eröffnen zum Lesen }
  Rewrite(f, dateiname);   { Eröffnen zum Schreiben/Überschreiben }
  Extend(f, dateiname);    { Eröffnen zum Schreiben/Anfügen }
Beispiel:
  PROGRAM file1(OUTPUT);
  VAR f : TEXT;
      s : STRING(80);
  BEGIN
    Rewrite(f, 'test.txt');
    Writeln(f, 'Hello, World');
    Close(f);

    Reset(f, 'test.txt');
    Readln(f, s);
    Writeln(s);
    Close(f);

    Extend(f, 'test.dat');
    Writeln(f, 'Hello, Again');
    Close(f);

    Reset(f, 'test.dat');
    WHILE NOT Eof(f) DO BEGIN
      Readln(f, s);
      Writeln(s);
    END;
  END.


P. Böhme, 05.09.1996