Fortran: Fortran 2003: Ein- und Ausgabe
| <<< zur Fortran-Startseite | |
| << Fortran 2003 | Bibliotheken >> |
| < Zeiger | Intrinsische Funktionen und Subroutinen > |
Streams
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?
- 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
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
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
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
Eine asynchrone I/O ermöglicht es einem Programm, Lese- oder Schreiboperationen durchzuführen und während dessen andere Anweisungen auszuführen, ohne auf den Abschluss der Ein-/Ausgabe zu warten.
Beispiel:
| Fortran 2003 (oder neuer)-Code |
program bsp
implicit none
integer :: X(500)
X = 10
print *, "Foo1"
open(1, asynchronous='yes', file="tmp.tmp")
write(1, asynchronous='yes', fmt="(i9)") X
print *, "Foo2"
wait(1)
close(1)
end program bsp
|
Rekursive I/O
Innerhalb eines rekursiv aufgerufenen Unterprogramms kann eine Lese- oder Schreiboperation durchgeführt wird. Dies kann teilweise problematisch sein.
Beispiel:
| Fortran 2003 (oder neuer)-Code |
recursive subroutine baum(n, z)
integer, intent(in) :: n, z
integer :: i
if (n <= 0) return
do i = 1, z
write(*,'(A)', advance="no") " "
end do
print *, n
call baum(n - 1, z + 1)
end subroutine baum
program bsp
call baum(3, 0)
end program bsp
|
Ausgabe:
3
2
1
Sonstiges
- flush
- iomsg
- round
- decimal
- sign
- ...
Siehe vorerst z.B. The New Features of Fortran 2003 (John Reid) (PDF)
| <<< zur Fortran-Startseite | |
| << Fortran 2003 | Bibliotheken >> |
| < Zeiger | Intrinsische Funktionen und Subroutinen > |