next up previous contents
Nächste Seite: Vordefinierte Unterprogramme Aufwärts: FILE oder Datei Vorherige Seite: Dateiende   Inhalt

OPEN-Anweisung

Wie schon erwähnt wird ein File einer UNIT i.a. mit der OPEN-Anweisung zugeordnet, dabei ist es möglich, mehrere Parameter zu spezifizieren (Default-Wert: formatgebunden und sequentiell):
ACCESS bestimmt die Zugriffsart der Datei
  mögliche Werte: SEQUENTIAL und DIRECT
ACTION gibt die zulässigen Operationen an:
  READ, WRITE oder READWRITE
BLANK legt die Interpretation von Leerzeichen fest
  NULL oder ZERO (Default: NULL)
DELIM legt die Begrenzung von Zeichenketten fest
  APOSTROPHE, QUOTE oder NONE (Default: NONE)
ERR mit Angabe einer Marke zu der im Falle eines Fehlers verzweigt werden soll
FILE Angabe des Namens der Datei, die zu öffnen ist
FORM Angabe der Form der zu öffnenden Datei:
  FORMATTED oder UNFORMATTED
IOSTAT wie bei READ-Anweisung
PAD sollen (bei zu kurzen Datensätzen) Füllzeichen übertragen werden?
  YES oder NO (Default: YES)
POSITION Angabe der Dateiposition: REWIND, APPEND oder ASIS
  (Default: ASIS, wie es ist)
RECL gibt im Falle von direct-access-Files die Record-Länge an
STATUS Angabe des Status einer zu öffnenden Datei:
  OLD, NEW, SCRATCH, REPLACE oder UNKNOWN (Default: UNKNOWN)
  SCRATCH bedeutet, daß die Datei beim Schließen gelöscht wird
  (sonst auch mit CLOSE-Anweisung und STATUS-Parameter DELETE möglich)
UNIT Angabe der File-Nummer, UNIT = kann entfallen, wenn die Zahl an erster
  Stelle der Parameterliste steht

Die meisten dieser Parameter kann man mit der INQUIRE-Anweisung abfragen, außerdem gibt es die Möglichkeit, die File-Existenz vor dem Öffnen mit INQUIRE (unit, FILE=file, EXIST=exist) abzufragen. Die logische Variable exist wird auf wahr gesetzt, wenn der File file existiert.

Beispiel: die Eingabe von der Tastatur wird - Zeile für Zeile - in ein direct-access-File gespeichert

PROGRAM hide
 IMPLICIT NONE
 CHARACTER * 80 :: file, zeile, loeschen*1
 INTEGER :: rec
 LOGICAL :: exist

 WRITE (*,'(A)') &
   'speichert die Eingabe - Zeile fuer Zeile - auf ein direct-access-File'
 WRITE (*,'(A)',ADVANCE='NO') 'geben Sie File ein: '
 READ (*,'(A)') file
 INQUIRE (FILE=file, EXIST=exist)
 IF (exist) THEN
  WRITE (*,'(A)',ADVANCE='NO') 'File existiert schon - loeschen [n]/j - '
  READ (*,'(A1)') loeschen
  IF (loeschen /= 'j') STOP
 ENDIF

 OPEN (10, FILE=file, STATUS='UNKNOWN', ACCESS='DIRECT', FORM='UNFORMATTED', &
           RECL = 80, ERR=100)

 rec = 1
 DO
  READ (*,'(A)',END=200) zeile
  WRITE (10, REC=rec) zeile
  rec = rec+1
 ENDDO
100 WRITE (*,'(A)') 'Fehler in OPEN'
    STOP
200 CLOSE (10)
    STOP
END
Und mit folgendem Programm könnte man diesen Text wieder lesen:
PROGRAM files
 IMPLICIT NONE
 CHARACTER * 80 :: file1, file2, zeile
 INTEGER :: rec, iostat, num = 6 ! Bildschirm!
 LOGICAL :: exist

 WRITE (*,'(A)') &
   'konvertiert direct-access, unformatted, recl=80 => sequential, formatted'
 WRITE (*,'(A)',ADVANCE='NO') 'geben Sie File ein: '
 READ (*,'(A)') file1
 INQUIRE (FILE=file1, EXIST=exist)
 IF (.NOT. exist) STOP 'File existiert nicht!'
 OPEN (10, FILE=file1, STATUS='OLD', ACCESS='DIRECT', FORM='UNFORMATTED', &
           RECL = 80, IOSTAT=iostat)
 IF (iostat /= 0) STOP 'Fehler beim OPEN'

 WRITE (*,'(A)',ADVANCE='NO') 'geben Sie File ein: '
 READ (*,'(A)') file2
 IF (file2 /= ") THEN
  num = 20
  INQUIRE (FILE=file2, EXIST=exist)
  IF (exist) STOP 'File existiert!'

  OPEN (20, FILE=file2, STATUS='NEW', ACCESS='SEQUENTIAL', FORM='FORMATTED', &
            IOSTAT=iostat)
  IF (iostat /= 0) STOP 'Fehler beim OPEN'
 ENDIF

 rec = 1
 DO
  READ (10, REC=rec, IOSTAT=iostat) zeile
  IF (IOSTAT /= 0) EXIT
  WRITE (num, '(A)') zeile
  rec = rec+1
 ENDDO
 CLOSE (10); CLOSE (num)
 STOP
END

next up previous contents
Nächste Seite: Vordefinierte Unterprogramme Aufwärts: FILE oder Datei Vorherige Seite: Dateiende   Inhalt
Reinfried O. Peter 2001-09-07