サーチ…
構文
-
WRITE(unit num, format num)
は、改行でデータを出力します。 -
READ(unit num, format num)
は、括弧の後の変数への入力です。 -
OPEN(unit num, FILE=file)
はファイルをオープンします。 (ファイルを開くためのより多くのオプションがありますが、それらはI / Oにとって重要ではありません。 -
CLOSE(unit num)
はファイルを閉じます。
シンプルなI / O
入力と出力を書く例として、実際の値をとり、ユーザーが負の数を入力するまで値とその正方形を返します。
以下で指定するように、 read
コマンドはユニット番号と書式指定子という2つの引数をとります。以下の例では、使用*
(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
何らかのエラーチェックで読む
現代の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標準で導入された)を使用して読み込むことができます。 command_argument_count
組み込み関数は、コマンドラインで提供される引数の数を知る方法を提供します。
すべてのコマンドライン引数は文字列として読み込まれるため、数値データに対して内部型変換を行う必要があります。一例として、この単純なコードは、コマンドラインで提供される2つの数値を合計します。
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引数は、 0
とcommand_argument_count
の結果の間の範囲に0
と便利です。値が0
場合、コマンド名が指定されます(サポートされている場合)。
多くのコンパイラは、コマンドライン引数にアクセスするために非標準の組み込み関数( getarg
など)も提供しています。これらは非標準であるため、対応するコンパイラのドキュメントを参照する必要があります。
get_command_argument
使用は、 length
引数とstatus
引数で上記の例を超えて拡張することができます。例えば、
character(5) arg
integer stat
call get_command_argument(number=1, value=arg, status=stat)
最初の引数が存在し、長さが5より大きい場合、 stat
の値は-1
なります。引数を取り出す際に他の困難がある場合、 stat
の値は正の数になります( arg
は完全に空白で構成されます)。それ以外の場合、その値は0
になり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)