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)