Syntax von Dateizugriffen
Der Zugriff auf ein File erfolgt immer nach demselben Schema: Zuerst muss dem Betriebssystem mitgeteilt werden, welches File bearbeitet werden soll; darauf muss das File geöffnet werden und erst dann kann man mit ihm arbeiten. Am Ende muss das File auch wieder geschlossen werden. Der Mechanismus des Öffnens und Schließens dient dazu, dem Betriebssystem zu ermöglichen, die entsprechenden Puffer und Datenstrukturen anzulegen, um den Zugriff auf ein File möglichst effizient zu machen. So wird zum Beispiel beim Schreiben auf eine Datei, die Harddisk nicht wirklich sofort in Bewegung gesetzt, sondern das Betriebsystem schreibt die Daten zuerst in einen Zwischenspeicher ("Puffer") und signalisiert dem aufrufenden Programm, dass die Daten gespeichert sind. Damit wird das aufrufende Programm nicht durch die langsame Harddisk gebremst. Das Betriebssystem schreibt dann die Daten zu einem späteren Zeitpunkt auf die Platte (das wird für den Benutzer transparent und im Hintergrund gemacht).
Wie schon erwähnt, erfolgt der Zugriff auf eine Datei über ihren Namen. Technisch gesehen wird dabei der Dateiname mit einer sogenannten "Filevariablen" assoziiert, die für den Programmierer unsichtbar die nötigen Detailinformationen über das File enthält. Die Filevariable wird durch die Schlüsselwörter "file of" und den Typ des File-Records definiert. Zusätzlich zur Filevariablen benötigt man aber noch eine Transfervariable vom Typ des File-Records, die zum Austausch der Daten zwischen File und Programm dient.
Beispiel: |
Das folgende Beispiel zeigt die notwendigen Deklarationen um auf ein File zugreifen zu können. Zuerst muss der Typ des Dateirecords definiert werden, in dem die Struktur des Records beschrieben wird. Angenommen, wir möchten Namen, Körpergröße und Gewicht mehrerer Personen in einer Datei speichern, so könnte der passende Record folgendermaßen aussehen:
type
TFPerson = record // Datentyp
Name : string;
Height : double;
Weight : double;
end;
Um nun tatsächlich auf das passende File zugreifen zu können, benötigt man noch eine Austauschvariable und eine Filevariable:
var
PersonData : TFPerson; // Austauschvariable
MyFile : file of TFPerson; // Filevariable
|
Die folgende Tabelle zeigt den Zugriff auf ein File im Einzelnen; es sind allerdings nur die am häufigsten benötigten Dateibefehle angeführt:
Schritt |
Pascal Befehle |
Erklärung |
1. Zuordnung |
assignfile (filevar, name); |
Mit AssignFile wird festgelegt, welche Filevariable welchem Filenamen zugeordnet wird. |
2. Öffnen |
rewrite (filevar); reset (filevar); append (filevar); |
Beim Öffnen des Files muss man sich entscheiden, ob man ein neues File anlegen (rewrite), auf ein bestehendes zugreifen (reset), oder an ein bestehendes File etwas anhängen (append) möchte (append funktioniert allerdings nur bei Textdateien).
|
3. Zugriff |
read (filevar, ....); write (filevar, ...); seek (filevar, pos); eof(filevar); |
Der Zugriff auf einzelne Records erfolgt mit Hilfe der Prozeduren read und write (für Textfiles gibt es auch die Möglichkeit mit readln und writeln ganze Zeilen zu lesen bzw. zu schreiben). Der Filepointer kann mit dem Aufruf von seek eingestellt werden. Die Funktion eof ("end of file") liefert TRUE zurück, falls der Filepointer das Ende eines Files erreicht hat.
|
4. Schließen |
closefile (filevar); |
Damit wird das jeweilige File geschlossen, d.h. die Information, die sich noch in Puffern befindet, wird auf die Platte geschrieben. ACHTUNG: Vergisst man auf das Schließen eines Files, so kann (und wird) es vorkommen, dass Teile der Daten verloren gehen (da ja der Inhalt des Filepuffers nicht auf die Platte geschrieben wird).
|
Beispiel: |
Der folgende Code-Ausschnitt zeigt einen typischen File-Zugriff; dabei werden sequentiell alle Records einer Datei gelesen und manche auf eine andere Datei ("OutFile") geschrieben:
type
TData = record // Datentyp
cnt : integer;
x : double;
y : double;
end;
var
InFile : file of TData; // Filevariable
MyData : TData; // Austauschvariable
begin
assignfile (InFile, 'meinedaten.dat'); // Eingangsdatei definieren
assignfile (OutFile, 'ergebnis.dat'); // Ergebnisdatei
reset (InFile); // Eingangsdatei öffnen
rewrite (OutFile); // Ergebnisdatei neu erzeugen
while not eof(InFile) do // solange das Ende der Eingangsdatei
begin // nicht erreicht ist...
read (InFile, MyData); // lies einen Record
if MyData.Cnt > 0 then // falls die Variable "Cnt" größer
write (OutFile, MyData); // als 0, wird der Record in die
end; // Ergebnisdatei geschrieben
closefile (InFile); // Eingangsdatei schließen
closefile (OutFile); // Ergebnisdatei schließen
end;
|
|