Wir haben bisher die Ein-/Ausgabe über die spezielle Standard-,,Datei`` Konsole (also Tastatur und Bildschirm) kennengelernt. Die allgemeine Ein-/Ausgabe erfolgt über sogenannte externe Dateien. Das sind Dateien, die auf einem beliebigen Speichermedium (Platte, Diskette, Band etc.) vorliegen. Diese Dateien haben einen Namen; er dient der Identifikation dieser Datei durch das FORTRAN-Programm einerseits und das Betriebssystem andererseits. Vor dem ersten Zugriff auf eine (neue oder bereits existierende) Datei muß die Datei geöffnet werden, wobei sie für die Ein-/Ausgabe eingerichtet und mit gewissen Dateiattributen versehen wird. Wir werden hier nur sequentielle Dateien behandeln.
Sequentielle Dateien kann man sich vorstellen als Dateien mit Zeilenstruktur. Jede Zeile enthält Daten in Form eines Datensatzes (record). Records können formatiert oder unformatiert sein. Auf die Records kann nur sequentiell (d.h. der Reihe nach) zugegriffen werden: auf eine bestimmte Zeile kann nur zugegriffen werden, wenn alle davorliegenden Zeilen bereits gelesen oder übersprungen wurden.
Bei jeder Anweisung zum Zugriff auf Dateien kann abgefragt werden, ob ein Fehler aufgetreten ist, z.B. durch Fehlen der Datei oder Erreichen des Dateiendes. Werden diese Abfragen nicht durchgeführt, bricht das Programm im Fehlerfall ab.
Auf Dateien wird in E/A-Anweisungen über die E/A-Einheit (auch: E/A-Kanal) Bezug genommen. Zum Beispiel spezifiziert die Anweisung
READ (2, 100) X, Y
die E/A-Einheit 2. Die Leseoperation wird auf der Datei durchgeführt, die der Einheit 2 zugeordnet ist. Die Zuordnung von Einheiten zu Dateien geschieht mit dem UNIT-Parameter in der OPEN-Anweisung (siehe unten).
In den Ein-/Ausgabeanweisungen können Parameter verwendet werden. Die wichtigsten E/A-Parameter werden im folgenden kurz erläutert.
,,UNIT=`` kann entfallen, wenn u der erste Parameter ist.
Standard-E/A-Einheiten sind meist UNIT=5 für die Eingabe, UNIT=6 für die Ausgabe, d.h. diese Angaben wirken wie UNIT=*.
ios ![]() |
: | die Abbarbeitung verlief fehlerfrei! |
ios ![]() |
: | eine Fehlerbedingung ist aufgetreten! |
ios ![]() |
: | das Dateiende wurde (beim Lesen) erreicht! |
Weitere Parameter können in einem FORTRAN-Handbuch nachgelesen werden.
Bei formatgebundener Ein-/Ausgabe muß eine Formatangabe spezifiziert werden. Die E/A-Liste darf fehlen. Jede formatgebundene E/A-Anweisung überträgt einen oder mehrere Datensätze. Formatgebundenes Lesen erfolgt mit der Anweisung
READ (UNIT = , FMT =
, IOSTAT =
, END =
, ERR =
)
oder kürzer
READ (,
, IOSTAT =
, END =
, ERR =
)
Formatgebundenes Schreiben erfolgt mit der Anweisung
WRITE (UNIT = , FMT =
, IOSTAT =
, ERR =
)
oder kürzer
WRITE (,
, IOSTAT =
, ERR =
)
oder auf die Standardausgabeeinheit mit
PRINT
Diese Anweisung wirkt wie WRITE(*,)
. Es gelten die bei den E/A-
Parametern gemachten Bemerkungen.
Beispiel (die OPEN-Anweisung wird unten erklärt):
! --- Beispiel fuer Ein-/Ausgabe PROGRAM IOTest IMPLICIT NONE REAL :: a, b INTEGER :: io1, io2, io3 ! --- vorhandene Datei oeffnen (Zuordnung Kanal 2): OPEN (2, FILE='Datei.2', IOSTAT=io1, STATUS='OLD') IF (io1 == 0) THEN ! --- Formatiert von Kanal 2 einlesen: READ (2, 100, IOSTAT = io2) a, b IF (io2 == 0) THEN ! --- Formatiert auf Console ausgeben: WRITE (*, 110, IOSTAT = io3) a, b ! --- Ausgabe bei Schreibfehler: IF (io3 /= 0) PRINT *, ' E/A-Fehler!' ELSEIF (io2 < 0) THEN ! --- Ausgabe bei Dateiende: PRINT *, ' Dateiende!' ELSE ! --- Ausgabe bei Lesefehler: WRITE (*,*) ' E/A-Fehler!' ENDIF ELSE ! --- Ausgabe falls die Datei nicht existiert: PRINT *, ' Fehler beim Oeffnen!' ENDIF ! --- Formatangaben: 100 FORMAT (2F10.4) 110 FORMAT (1X, 2(F10.4, 2X) ) END
Falls während des Öffnens der Datei ein Fehler auftritt, weil die Datei nicht existiert, wird der INTEGER-Variablen io1 ein Wert größer als Null zugewiesen. Der IF-Block wählt nun den Pfad für die zugehörige Fehlerausgabe. Sonst werden entsprechend der FORMAT-Anweisung 100 zwei Werte gelesen. Beim Lesen oder dem anschließenden Schreiben gemäß FORMAT-Anweisung 110 verzweigt das Programm wieder in Abhängikeit davon, ob io2 und io3 größer, kleiner oder gleich Null sind, und gibt im Fehlerfall eine passende Meldung auf dem Bildschirm aus.
Die Möglichkeit der formatfreien (unformatierten) Ein-/Ausgabe soll hier auch noch erwähnt werden. Dabei werden die Daten nicht konvertiert, sondern in binärer Form übertragen. Diese E/A-Methode wird benutzt, um Daten schnell zwischenzuspeichern, um sie z.B. in einem nachfolgenden Programmlauf weiterzuverarbeiten. Näheres entnehme man der FORTAN-Literatur.
Die Anweisungen für listengesteuerte Ein-/Ausgabe entsprechen formal denen für formatierte E/A, mit der Einschränkung, daß für die Formatangabe ein Stern gesetzt wird: FMT=*. Wir haben den Spezialfall der listengesteuerten E/A über Standard-E/A-Einheiten schon in Abschnitt 4.2.13 kennengelernt.
Mit Ein-/Ausgabe-Status-Anweisungen werden Eigenschaften einer Datei festgelegt, geprüft oder geändert. Hier sollen nur die wichtigsten Parameter der Anweisungen angegeben werden.
Mit der OPEN-Anweisung
OPEN (UNIT = , FILE =
, STATUS =
, IOSTAT =
,
ERR =
)
wird die dem FORTRAN-Programm
bekannte E/A-Einheit der
Datei mit dem Namen
(auf Betriebssystemebene) zugeordnet.
ist dabei ein Zeichenausdruck.
Das Programm nimmt also auf die Datei
Bezug durch die E/A-Einheit mit
der Nummer
.
ist ebenfalls ein Zeichenausdruck,
der den erwarteten Status der zu öffnenden Datei angibt.
Dabei kann
folgende Werte entahlten
'OLD' | : | die Datei soll bereits existieren |
'NEW' | : | die Datei darf noch nicht existieren, sondern wird erst mit dieser Anweisung angelegt |
'UNKNOWN' | : | das ist die Standardeinstellung; existiert sie noch nicht, wird sie angelegt, ansonsten wird die vorhandene Datei geöffnet |
Im Fehlerfall wird der Variablen ein
Wert ungleich Null zugewiesen und/oder zur Anweisung mit der
Marke
verzweigt. Die Angabe der
E/A-Einheit
ist unbedingt erforderlich,
die anderen Parameter können
gegebenenfalls fehlen.
Beispiel:
OPEN (6, FILE = 'OUTPUT')
Neben der Zuordnung lassen sich mit der OPEN-Anweisung auch Details des Zugriffs auf die Datei (Dateiattribute) festlegen. Wir werden hierauf nicht weiter eingehen und verweisen auf weiterführende FORTRAN-Literatur.
Mit der CLOSE-Anweisung
CLOSE (UNIT = )
wird eine Datei von der E/A-Einheit
getrennt. Danach kann z.B. die
E/A-Einheit
mit einer anderen Datei
verbunden werden. Die abgetrennte
Datei kann z.B. zurückgegeben werden.
Bei Programmende (END, STOP) findet
ein selbständiges CLOSE statt.
Zur Abfrage des Zustands einer E/A-Einheit oder einer Datei dient die INQUIRE-Anweisung. Sie soll hier nicht weiter besprochen werden; hierfür wird auf die FORTRAN-Literatur (z.B. [#!rrzn!#] ) verwiesen.
Zur Positionierung von sequentiellen Dateien gibt es drei Anweisungen.
Die REWIND-Anweisung
REWIND (UNIT = , ERR =
)
setzt eine Datei auf den Anfang zurück, so daß der nächste in einer E/A-Anweisung angesprochene Datensatz der erste Datensatz dieser Datei ist.
Die BACKSPACE-Anweisung
BACKSPACE (UNIT = , ERR =
)
setzt die E/A-Einheit um einen
Datensatz (d.h. um eine Zeile) zurück.
Die ENDFILE-Anweisung
ENDFILE (UNIT = , ERR =
)
schreibt einen speziellen Datensatz, den
sogenannten Dateiendesatz auf die
E/A-Einheit . Diese Dateiendesätze
können beim Lesen z.B. mit dem
E/A-Parameter ,,END=``
erkannt werden. Das Dateiende wird aber auch erkannt
wenn kein Dateiendesatz vorhanden ist.
In allen drei Positionierungsanweisungen
ist die Angabe von erforderlich;
das Schlüsselwort ,,UNIT=`` kann
entfallen, wenn
der erste Parameter ist.