Szukaj…


Składnia

  • WRITE(unit num, format num) wyświetla dane po nawiasach w nowym wierszu.
  • READ(unit num, format num) wprowadza zmienne po nawiasach.
  • OPEN(unit num, FILE=file) otwiera plik. (Istnieje więcej opcji otwierania plików, ale nie są one ważne dla operacji we / wy.
  • CLOSE(unit num) zamyka plik.

Proste we / wy

Jako przykład zapisu danych wejściowych i wyjściowych weźmiemy wartość rzeczywistą i zwracamy wartość i jej kwadrat, dopóki użytkownik nie wprowadzi liczby ujemnej.

Jak podano poniżej, polecenie read przyjmuje dwa argumenty: numer jednostki i specyfikator formatu. W poniższym przykładzie używamy * dla numeru jednostki (który wskazuje stdin) i * dla formatu (który wskazuje domyślną wartość dla reals, w tym przypadku). Określamy również format instrukcji print . Alternatywnie można użyć write(*,"The value....") lub po prostu zignorować formatowanie i ustawić go jako

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

co prawdopodobnie spowoduje powstanie dziwnie rozmieszczonych ciągów i wartości.

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

Przeczytaj z pewnym sprawdzaniem błędów

Nowoczesny przykład Fortrana, który obejmuje sprawdzanie błędów i funkcję uzyskania nowego numeru jednostki dla pliku.

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

Przekazywanie argumentów wiersza poleceń

Tam, gdzie obsługiwane są argumenty wiersza poleceń, można je odczytać za pomocą wewnętrznej funkcji get_command_argument (wprowadzonej w standardzie Fortran 2003). command_argument_count wewnętrzna zapewnia sposób znać liczbę argumentów przedstawionych w wierszu poleceń.

Wszystkie argumenty wiersza poleceń są odczytywane jako ciągi, dlatego dla danych liczbowych należy wykonać konwersję typu wewnętrznego. Na przykład ten prosty kod sumuje dwie liczby podane w wierszu polecenia:

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

Liczba argumentem get_command_argument pożytkiem waha się między 0 a wynik command_argument_count . Jeśli wartość wynosi 0 to podawana jest nazwa polecenia (jeśli jest obsługiwana).

Wiele kompilatorów oferuje również niestandardowe funkcje wewnętrzne (takie jak getarg ), aby uzyskać dostęp do argumentów wiersza poleceń. Ponieważ są one niestandardowe, należy zapoznać się z odpowiednią dokumentacją kompilatora.


Użycie get_command_argument może zostać rozszerzone poza powyższy przykład o argumenty length i status . Na przykład za pomocą

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

wartość stat wyniesie -1 jeśli pierwszy argument istnieje i ma długość większą niż 5. Jeśli istnieje inna trudność w uzyskaniu argumentu, wartość stat będzie miała pewną liczbę dodatnią (a arg będzie się składać wyłącznie ze spacji). W przeciwnym razie jego wartość będzie wynosić 0 .

Argument length może być łączony ze zmienną znakową o odroczonej długości, tak jak w poniższym przykładzie.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow