수색…


통사론

  • WRITE(unit num, format num) 는 괄호 뒤에 새 행의 데이터를 출력합니다.
  • READ(unit num, format num) 는 대괄호 뒤에 변수에 입력합니다.
  • OPEN(unit num, FILE=file) 엽니 다. (파일을 여는 데는 더 많은 옵션이 있지만 I / O에는 중요하지 않습니다.
  • CLOSE(unit num) 는 파일을 닫습니다.

단순 I / O

입력 및 출력을 작성하는 예제로서, 사용자가 음수를 입력 할 때까지 실제 값을 받아 값과 사각형을 반환합니다.

아래에 명시된 바와 같이, read 명령은 유닛 번호와 형식 지정자의 두 인수를 취합니다. 아래의 예에서는 사용 * 유닛 (나타내는 표준 입력)을 위해 번호 * (이 경우에는, 실수의 기본을 나타낸다)를 포맷. 또한 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

몇 가지 오류 검사와 함께 읽기

오류 검사와 파일의 새로운 유닛 번호를 얻는 함수를 포함하는 현대 Fortran 예제.

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 표준에서 소개 get_command_argument 를 통해 읽을 수 있습니다. 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

get_command_argument 의 number 인수는 0command_argument_count 의 결과 사이에서 유용합니다. 값이 0 이면 명령 이름이 제공됩니다 (지원되는 경우).

많은 컴파일러는 명령 행 인수에 액세스하기 위해 비표준 내장 함수 (예 : getarg )를 제공합니다. 이것들은 표준이 아니므로 해당 컴파일러 문서를 참조해야합니다.


get_command_argument 사용은 lengthstatus 인수로 위의 예를 넘어 확장 될 수 있습니다. 예를 들어,

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

첫 번째 인수가 있고 길이가 5보다 큰 경우 stat 의 값은 -1 됩니다. 인수를 검색하는 데 다른 어려움이있는 경우 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)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow