Zoeken…


Syntaxis

  • WRITE(unit num, format num) voert de gegevens achter de haakjes uit op een nieuwe regel.
  • READ(unit num, format num) voert de invoer in naar de variabele achter de haakjes.
  • OPEN(unit num, FILE=file) opent een bestand. (Er zijn meer opties voor het openen van bestanden, maar deze zijn niet belangrijk voor I / O.
  • CLOSE(unit num) sluit een bestand.

Eenvoudige I / O

Als een voorbeeld van het schrijven van invoer en uitvoer, nemen we een echte waarde en geven we de waarde en het kwadraat terug totdat de gebruiker een negatief getal invoert.

Zoals hieronder gespecificeerd, heeft de opdracht read twee argumenten: het eenheidsnummer en de opmaakspecificatie. In het onderstaande voorbeeld gebruiken we * voor het eenheidsnummer (dat stdin aangeeft) en * voor het formaat (dat in dit geval de standaardwaarde voor reals aangeeft). We specificeren ook het formaat voor de print . Je kunt ook write(*,"The value....") of gewoon de opmaak negeren en het als hebben

print *,"The entered value was ", x," and its square is ",x*x

wat waarschijnlijk resulteert in een aantal vreemd gespreide tekenreeksen en waarden.

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

Lezen met enige foutcontrole

Een modern Fortran-voorbeeld met foutcontrole en een functie om een nieuw eenheidsnummer voor het bestand te krijgen.

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

Opdrachtregelargumenten doorgeven

Waar opdrachtregelargumenten worden ondersteund, kunnen deze worden ingelezen via het intrinsic get_command_argument (geïntroduceerd in de Fortran 2003-standaard). De command_argument_count intrinsieke biedt een manier om het aantal argumenten op de opdrachtregel te leren kennen.

Alle opdrachtregelargumenten worden ingelezen als tekenreeksen, dus moet een interne typeconversie worden uitgevoerd voor numerieke gegevens. Deze eenvoudige code somt bijvoorbeeld de twee nummers op de opdrachtregel op:

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

Het argument voor get_command_argument in get_command_argument varieert handig tussen 0 en het resultaat van command_argument_count . Als de waarde 0 wordt de opdrachtnaam opgegeven (indien ondersteund).

Veel compilers bieden ook niet-standaard intrinsiek (zoals getarg ) voor toegang tot opdrachtregelargumenten. Aangezien deze niet-standaard zijn, moet de bijbehorende compiler-documentatie worden geraadpleegd.


Gebruik van get_command_argument kan worden verlengd bovenstaand voorbeeld de length en status argumenten. Bijvoorbeeld met

character(5) arg
integer stat
call get_command_argument(number=1, value=arg, status=stat)

de waarde van stat is -1 als het eerste argument bestaat en een lengte heeft die groter is dan 5. Als er een andere moeilijkheid is om het argument te achterhalen, zal de waarde van stat een positief getal zijn (en arg zal volledig uit spaties bestaan). Anders is de waarde 0 .

Het argument length kan worden gecombineerd met een variabele met een uitgestelde lengte, zoals in het volgende voorbeeld.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow