Claus Schönleber

Hitchhacker´s Guide To PASCAL  [Vol. 2]

 [ zurück | weiter ]
  [ Start | Beispielprogramme Download | Home ]

Inhalt

Typisierte 
 Konstanten
Sets (Mengen)
Rekursion
Records
Dateien
 (Random Access)
Pointer
Algorithmen
- Hashing
- Sortieren
 
 

Dateien [2]: Random Access Dateien

In Kurs 1 wurden Dateien schon angesprochen und mit sequentiellen Dateien verwendet. Nun kommen wir zu einer anderen Organisationsform, die durch eine Einschränkung einige Freiheiten bringt, die wir bei sequentiellen Dateien nicht hatten.

Eigenschaften:

  • Datensätze müssen gleichlang sein.
  • Die Datei kann gleichzeitig gelesen und beschrieben werden.
  • Man kann an die Datei Daten anhängen.
  • Datensätze können direkt gelesen werden (durch die Berechenbarkeit ihrer Position).
  • Der Dateizeiger ist frei beweglich.
Die Deklaration geschieht denkbar einfach:
<variable> : FILE OF <typ>
Geöffnet wird eine solche Datei mit "reset", wenn Sie existiert, mit "rewrite" wenn Sie angelegt werden soll. Existiert Sie einmal, kann nach "reset" beliebig gelesen oder geschrieben werden. Um den Dateizeiger frei bewegen zu können, muß es natürlich eine weitere Standardfunktion geben:
seek (<dateivariable>,<position>)
wobei <position> ein integer-Ausdruck zwischen 0 und Dateigröße minus 1 sein muß, da die Datensätze mit 0 beginnend durchnumeriert werden. Die Dateigröße läßt sich leicht mit der Funktion
filesize (<dateivariable>) 
ermitteln. Auch hier ein kleines Demonstrationsprogramm:
PROGRAM rad;
  VAR workfile : FILE OF char;
      c        : char;
      i        : integer;
BEGIN
  assign (workfile,'CHARS.DAT');
  rewrite (workfile);
  FOR i := 1 TO 100 DO
  BEGIN
    c := chr (random (127) + 1);
    write (workfile,c);
  END;
  close (workfile);
  reset (workfile);
  writeln ('Die Datei hat ',filesize (workfile),' Datensätze.');
  writeln;
  REPEAT
    REPEAT
      write ('Datensatznummer: ');
      readln (i);
    UNTIL (i >= -1) AND (i <= 100);
    IF (i >= 0) THEN
    BEGIN
      seek (workfile,i);
      read (workfile,c);
      writeln ('Datensatznummer ',i,' ASCII-Zeichen Nr. ',ord (c));
    END;
  UNTIL (i = -1);
  close (workfile);
END.
Das Programm macht nichts anderes, als 100 Zufallszahlen in Zeichen zu verwandeln und in eine Datei wegzuschreiben. Danach kann man eine Datensatznummer eingeben und bekommt das dort gespeicherte Zeichen auf dem Bildschirm angezeigt. Bei Eingabe von -1 terminiert das Programm. Die kleine REPEAT-Schleife dient nur zum Abfangen eines Eingabefehlers.

Natürlich sind Random Access Dateien nicht immer so einfach in ihrer Struktur. Wie oben schon erwähnt, werden häufig nicht einfache Typen, sondern RECORD-Typen zur Datensatzdefinition herangezogen. Eine solche Definition kann dann so aussehen:

TYPE person = RECORD
                name,
                vorname,
                strasse,
                ort,
                telefon : STRING [50];
                privat : boolean;
              END;

VAR workfile : FILE OF person;
    object   : person;
Die Variable "object" dient als Vermittler oder Puffer zwischen Datei und Ein-/Ausgabegerät. Sie ist mit "c" im obigen Beispiel zu vergleichen. Ihr Inhalt wird in die Datei geschrieben oder sie bekommt die Daten eines Datensatzes aus der Datei beim Lesevorgang.

Bei der Benutzung von solchen Dateien drängt sich natürlich die Frage auf, wie findet man ein gesuchtes Datum. Am einfachsten natürlich, wenn die Datei Datensatz für Datensatz durchsucht wird. Aber wir sind ja nicht auf diese "Brute Force"-Methode beschränkt wie bei der sequentiellen Datei. Eine weitere einfache Methode ist die Eingabe der Datensatznummer wie im letzten Programmbeispiel. Man könnte die Datensatznummer als Artikelnummer oder Personalnummer interpretieren und anhand einer Liste diese Nummer ermitteln. Aber es gibt natürlich noch andere Methoden. Es würde zu weit führen, in einem PASCAL-Lehrbuch allgemeine Programmiermethoden der fortgeschrittenen Art zu besprechen. Unter dem Stichwort "Hashing" wird in einem späteren Kapitel noch Einführendes zu diesem Thema erläutert.
 

 [ zurück | weiter ]
   (c) 2001 Schoenleber.com