Suche…
Syntax
-
WRITE(unit num, format num)
gibt die Daten nach den Klammern in einer neuen Zeile aus. -
READ(unit num, format num)
die Variable hinter den Klammern ein. -
OPEN(unit num, FILE=file)
öffnet eine Datei. (Es gibt mehr Optionen zum Öffnen von Dateien, diese sind jedoch für die E / A nicht wichtig. -
CLOSE(unit num)
schließt eine Datei.
Einfache E / A
Als Beispiel für das Schreiben von Eingabe und Ausgabe nehmen wir einen reellen Wert und geben den Wert und sein Quadrat zurück, bis der Benutzer eine negative Zahl eingibt.
Wie unten angegeben, benötigt der read
zwei Argumente: die Gerätenummer und den Formatbezeichner. Im folgenden Beispiel verwenden wir *
für die Einheitsnummer (was stdin angibt) und *
für das Format (das in diesem Fall den Standardwert für reelle Zahlen angibt). Wir legen auch das Format für die print
. Man kann alternativ write(*,"The value....")
oder einfach die Formatierung ignorieren und als haben
print *,"The entered value was ", x," and its square is ",x*x
Dies führt wahrscheinlich zu seltsam beabstandeten Zeichenfolgen und Werten.
program SimpleIO
implicit none
integer, parameter :: wp = selected_real_kind(15,307)
real(kind=wp) :: x
! we'll loop over until user enters a negative number
print '("Enter a number >= 0 to see its square. Enter a number < 0 to exit.")'
do
! this reads the input as a double-pricision value
read(*,*) x
if (x < 0d0) exit
! print the entered value and it's square
print '("The entered value was ",f12.6,", its square is ",f12.6,".")',x,x*x
end do
print '("Thank you!")'
end program SimpleIO
Lesen Sie mit einigen Fehlerprüfungen
Ein modernes Fortran-Beispiel, das die Fehlerprüfung und eine Funktion zum Abrufen einer neuen Gerätenummer für die Datei beinhaltet.
module functions
contains
function get_new_fileunit() result (f)
implicit none
logical :: op
integer :: f
f = 1
do
inquire(f,opened=op)
if (op .eqv. .false.) exit
f = f + 1
enddo
end function
end module
program file_read
use functions, only : get_new_fileunit
implicit none
integer :: unitno, ierr, readerr
logical :: exists
real(kind(0.d0)) :: somevalue
character(len=128) :: filename
filename = "somefile.txt"
inquire(file=trim(filename), exist=exists)
if (exists) then
unitno = get_new_fileunit()
open(unitno, file=trim(filename), action="read", iostat=ierr)
if (ierr .eq. 0) then
read(unitno, *, iostat=readerr) somevalue
if (readerr .eq. 0) then
print*, "Value in file ", trim(filename), " is ", somevalue
else
print*, "Error ", readerr, &
" attempting to read file ", &
trim(filename)
endif
else
print*, "Error ", ierr ," attempting to open file ", trim(filename)
stop
endif
else
print*, "Error -- cannot find file: ", trim(filename)
stop
endif
end program file_read
Befehlszeilenargumente übergeben
Wenn Befehlszeilenargumente unterstützt werden, können sie über das intrinsic get_command_argument
(eingeführt im Fortran 2003-Standard) eingelesen werden. Mit dem command_argument_count
die Anzahl der Argumente in der Befehlszeile ermitteln.
Alle Befehlszeilenargumente werden als Zeichenfolgen eingelesen. Daher muss für numerische Daten eine interne Typkonvertierung durchgeführt werden. Dieser einfache Code summiert beispielsweise die beiden Zahlen, die in der Befehlszeile angegeben werden:
PROGRAM cmdlnsum
IMPLICIT NONE
CHARACTER(100) :: num1char
CHARACTER(100) :: num2char
REAL :: num1
REAL :: num2
REAL :: numsum
!First, make sure the right number of inputs have been provided
IF(COMMAND_ARGUMENT_COUNT().NE.2)THEN
WRITE(*,*)'ERROR, TWO COMMAND-LINE ARGUMENTS REQUIRED, STOPPING'
STOP
ENDIF
CALL GET_COMMAND_ARGUMENT(1,num1char) !first, read in the two values
CALL GET_COMMAND_ARGUMENT(2,num2char)
READ(num1char,*)num1 !then, convert them to REALs
READ(num2char,*)num2
numsum=num1+num2 !sum numbers
WRITE(*,*)numsum !write out value
END PROGRAM
Das Argument number in get_command_argument
zweckmäßigerweise zwischen 0
und dem Ergebnis von command_argument_count
. Wenn der Wert 0
ist, wird der Befehlsname angegeben (sofern unterstützt).
Viele Compiler bieten auch nicht standardisierte Intrinsics (wie z. B. getarg
) für den Zugriff auf Befehlszeilenargumente. Da es sich nicht um Standard handelt, sollten Sie die entsprechende Dokumentation des Compilers konsultieren.
Verwendung von get_command_argument
kann sich über dem obigen Beispiel mit der verlängerten werden length
und status
Argumente. Zum Beispiel mit
character(5) arg
integer stat
call get_command_argument(number=1, value=arg, status=stat)
Der Wert von stat
ist -1
wenn das erste Argument vorhanden ist und eine Länge größer als 5 hat. Wenn beim Abrufen des Arguments andere Schwierigkeiten auftreten, wird der Wert von stat
eine positive Zahl sein (und arg
besteht ausschließlich aus Leerzeichen). Andernfalls ist der Wert 0
.
Die length
Argument kann mit einer aufgeschobenen Länge Zeichenvariable kombiniert werden, wie in dem folgenden Beispiel.
character(:), allocatable :: arg
integer arglen, stat
call get_command_argument(number=1, length=arglen) ! Assume for simplicity success
allocate (character(arglen) :: arg)
call get_command_argument(number=1, value=arg, status=stat)