Fortran: Fortran 2003: Ein- und Ausgabe

Aus Wikibooks
<<< zur Fortran-Startseite
<< Fortran 2003 Bibliotheken >>
< Zeiger Intrinsische Funktionen und Subroutinen >


Streams[Bearbeiten]

Fortran 2003 bietet zusätzlich zum altbekannten datensatzbasierten I/O nun auch Dateieingabe und -ausgabe in Form von Streams, wie das z.B. in der Programmiersprache C seit jeher üblich ist.

Unterschied zum alten I/O-Konzept?[Bearbeiten]

  • Streams ermöglichen das Lesen und Schreiben von Binärdateien, ohne sich mit den auf Datensätzen aufbauenden Strukturen der konventionellen Fortran-I/O herumschlagen zu müssen.
  • Bei der Ein-/Ausgabe mit Streams wird die Datei als kontinuierliche Byte-Sequenz betrachtet.
  • Stream-I/O ist logischerweise nicht für interne Dateien gedacht.

Anwendung[Bearbeiten]

Auch wenn Stream-I/O in Fortran 2003 ein neues Konzept ist, so sind die altbekannten open-, read-, write-und close-Befehle dafür zuständig.

  • Öffnen eines Streams:
open( ..., access = "STREAM", ... )
  • Lesen und Schreiben:
read( ... ) ...
write( ... ) ... 
  • Schließen eines Streams:
close( ... )

Unformatierte Stream-I/O[Bearbeiten]

Beispiel:

Fortran 2003 (oder neuer)-Code
program bsp
  implicit none

  real                 :: a = 55.678
  real                 :: b
  character( len = 3 ) :: str

  open( 50, file = "test", access = "STREAM", status = "REPLACE")
  
  write( 50 ) "Hallo Welt"
  write( 50 ) "Hello World"
! Ausgabe in Datei: siehe Bild 1
  
  write( 50, pos = 100 ) "Greetings"
! Ausgabe in Datei: siehe Bild 2
    
  write( 50, pos = 60 ) a
! Ausgabe in Datei: siehe Bild 3

  read( 50, pos = 60 ) b
  write( *, * ) b
! Ausgabe:
!   55.678  

  read( 50, pos = 8 ) str
  write( *, * ) str
! Ausgabe:
!   elt 

  close( 50 )
end program bsp


Da es sich um eine unformatierte Ein-/Ausgabe handelt, darf natürlich kein Formatspezifizierer bei den read- und write-Anweisungen angegeben werden, auch kein *. Mittels pos-Spezifizierer kann an eine bestimmte Position in der Datei gesprungen werden.

Bild 1
Bild 2
Bild 3

Formatierte Stream-I/O[Bearbeiten]

Beispiel:

Fortran 2003 (oder neuer)-Code
program bsp
  implicit none

  real                  :: a = 55.678
  real                  :: b = 13.9876
  character( len = 20 ) :: str1, str2, str3
  integer               :: fposition 

  open( 50, file = "test", access = "STREAM", form = "FORMATTED", status = "REPLACE")
  
  write( 50, "(2A20)" ) "Hallo Welt", "Hello World"

  inquire( 50, pos = fposition )
  write( *, * ) fposition

  write( 50, * ) a, new_line( "x" ), b, " abcdef"

  read( 50, *, pos = fposition ) a
  write( *, * ) a

  read( 50, *, pos = 1 ) str1, str2, str3
  write( *, * ) str1, str2, str3
  

  read( 50, * ) str1, a
  write( *, * ) str1, a

! Ausgabe in Datei:
!              Hallo Welt         Hello World
!   55.678
!   13.9876  abcdef

! Ausgabe auf Bildschirm:
!   42
!   55.678
!   Hallo               Welt                Hello
!   55.678               13.9876
  
  close( 50 )
end program bsp

Asynchrone I/O[Bearbeiten]

Rekursive I/O[Bearbeiten]

Sonstiges[Bearbeiten]

Weblinks[Bearbeiten]



<<< zur Fortran-Startseite
<< Fortran 2003 Bibliotheken >>
< Zeiger Intrinsische Funktionen und Subroutinen >