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)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow