next up previous contents
Nächste Seite: Interne Ein-/Ausgabe Aufwärts: Erweiterte Ein-/Ausgabe Vorherige Seite: Formatierte Ein-/Ausgabe   Inhalt

Externe Ein-/Ausgabe

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=u
spezifiziert die E/A-Einheit für den Zugriff auf eine externe Datei oder spezifiziert die interne Datei (siehe ,,interne Ein-/Ausgabe``). Für u gibt es folgende Möglichkeiten:
-
ein * bedeutet die Standardeinheit (in der Regel die Konsole),
-
ein ganzzahliger Ausdruck mit $0
\le u \le 999$,
-
der Name einer Zeichengröße, die eine interne Datei definiert.

,,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=*.

FMT=fn
Formatangabe für formatierte Ein-/Ausgabe. Für fn gibt es unter anderem folgende Möglichkeiten:
-
die Anweisungsmarke einer FORMAT-Anweisung in der selben Programmeinheit,
-
eine Zeichengröße, deren Wert die Formatangabe enthält,
-
ein Stern * für listengesteuerte E/A.
Wenn ,,UNIT=`` fehlt, darf auch ,,FMT=`` fehlen, und die Formatangabe muß an zweiter Stelle in der Liste stehen.

IOSTAT=ios
Mit dem optionalen IOSTAT-Parameter spezifiziert man eine ganzzahlige Variable ios, der, je nach Korrektheit der Abbarbeitung der Anweisung, einer der folgenden Werte zugewiesen wird:

ios $= \ 0$ : die Abbarbeitung verlief fehlerfrei!
ios $> \ 0$ : eine Fehlerbedingung ist aufgetreten!
ios $< \ 0$ : das Dateiende wurde (beim Lesen) erreicht!

END=labl
Marke einer ausführbaren Anweisung, zu der bei Erreichen des Dateiendes beim Lesen verzweigt wird. (Optionaler Parameter)
ERR=labl
Marke einer ausführbaren Anweisung, zu der im Fehlerfall verzweigt wird. (Optionaler Parameter)
iolist
E/A-Liste.

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 = $u$, FMT = $fn$, IOSTAT = $ios$, END = $labl$, ERR = $labl$) $iolist$

oder kürzer

READ ($u$, $fn$, IOSTAT = $ios$, END = $labl$, ERR = $labl$) $iolist$

Formatgebundenes Schreiben erfolgt mit der Anweisung

WRITE (UNIT = $u$, FMT = $fn$, IOSTAT = $ios$, ERR = $labl$) $iolist$

oder kürzer

WRITE ($u$, $fn$, IOSTAT = $ios$, ERR = $labl$) $iolist$

oder auf die Standardausgabeeinheit mit

PRINT $ fn, iolist$

Diese Anweisung wirkt wie WRITE(*,$fn$) $iolist$ . 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 = $u$, FILE = $fil$, STATUS = $stat$, IOSTAT = $ios$, ERR = $labl$)

wird die dem FORTRAN-Programm bekannte E/A-Einheit $u$ der Datei mit dem Namen $fil$ (auf Betriebssystemebene) zugeordnet. $fil$ ist dabei ein Zeichenausdruck. Das Programm nimmt also auf die Datei $fil$ Bezug durch die E/A-Einheit mit der Nummer $u$. $stat$ ist ebenfalls ein Zeichenausdruck, der den erwarteten Status der zu öffnenden Datei angibt. Dabei kann $stat$ 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 $ios$ ein Wert ungleich Null zugewiesen und/oder zur Anweisung mit der Marke $labl$ verzweigt. Die Angabe der E/A-Einheit $u$ 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 = $u$)

wird eine Datei von der E/A-Einheit $u$ getrennt. Danach kann z.B. die E/A-Einheit $u$ 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 = $u$, ERR = $labl$)

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 = $u$, ERR = $labl$)

setzt die E/A-Einheit $u$ um einen Datensatz (d.h. um eine Zeile) zurück.

Die ENDFILE-Anweisung

ENDFILE (UNIT = $u$, ERR = $labl$)

schreibt einen speziellen Datensatz, den sogenannten Dateiendesatz auf die E/A-Einheit $u$. 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 $u$ erforderlich; das Schlüsselwort ,,UNIT=`` kann entfallen, wenn $u$ der erste Parameter ist.


next up previous contents
Nächste Seite: Interne Ein-/Ausgabe Aufwärts: Erweiterte Ein-/Ausgabe Vorherige Seite: Formatierte Ein-/Ausgabe   Inhalt
Lars Tornow 2003-03-31