Поиск…
Синтаксис
-
WRITE(unit num, format num)
выводит данные после скобок в новой строке. -
READ(unit num, format num)
вводится в переменную после скобок. -
OPEN(unit num, FILE=file)
открывает файл. (Есть больше возможностей для открытия файлов, но они не важны для ввода-вывода. -
CLOSE(unit num)
закрывает файл.
Простой ввод-вывод
В качестве примера ввода ввода и вывода мы возьмем реальное значение и вернем значение и его квадрат, пока пользователь не введет отрицательное число.
Как указано ниже, команда read
принимает два аргумента: номер устройства и спецификатор формата. В приведенном ниже примере мы используем *
для номера единицы (который указывает stdin) и *
для формата (который в данном случае указывает значение по умолчанию для реалов). Мы также указываем формат для оператора print
. В качестве альтернативы можно использовать write(*,"The value....")
или просто игнорировать форматирование и использовать его как
print *,"The entered value was ", x," and its square is ",x*x
что, вероятно, приведет к некоторым странно разнесенным строкам и значениям.
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
Чтение с некоторой проверкой ошибок
Современный пример Фортрана, который включает проверку ошибок и функцию для получения нового номера устройства для файла.
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
Передача аргументов командной строки
Если аргументы командной строки поддерживаются, их можно прочитать через встроенный get_command_argument
(введенный в стандарте Fortran 2003). Свойство command_argument_count
позволяет узнать количество аргументов, предоставленных в командной строке.
Все аргументы командной строки считываются как строки, поэтому для числовых данных должно быть выполнено преобразование внутреннего типа. В качестве примера этот простой код суммирует два числа, указанные в командной строке:
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
Аргумент number в get_command_argument
полезен в диапазоне от 0
до результата command_argument_count
. Если значение равно 0
тогда указывается имя команды (если поддерживается).
Многие компиляторы также предлагают нестандартные встроенные функции (например, getarg
) для доступа к аргументам командной строки. Поскольку они нестандартны, следует проконсультироваться с соответствующей документацией компилятора.
Использование get_command_argument
может быть расширено за пределами приведенного выше примера аргументами length
и status
. Например, с
character(5) arg
integer stat
call get_command_argument(number=1, value=arg, status=stat)
значение stat
будет равным -1
если существует первый аргумент и имеет длину больше 5. Если есть какая-то другая трудность при извлечении аргумента, значение stat
будет некоторым положительным числом (и arg
будет состоять полностью из пробелов). В противном случае его значение будет равно 0
.
Аргумент length
может быть объединен с переменной длины отложенной длины, например, в следующем примере.
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)