fortran90です。
ファイルが存在するかしないかを確かめるためのプログラムです。
組み込み関数”access”を用いると簡単に確認できます。
program main
implicit none
integer::access
write(6,*)access( "./temp.d", " ")
stop
end program main
implicit none
integer::access
write(6,*)access( "./temp.d", " ")
stop
end program main
上の文は、もしもファイル “./temp.d” が今いるディレクトリに存在するかどうかを返すものです。
また、access関数はファイルの有無(引数は空白文字” “)のみならず、そのファイルの読み取り権限(引数は”r”)、書き込み権限(引数は”w”)、実行権限(引数は”x”)を調べることができます。
ゼロが返ってきたらその権限(ファイルの有無)があるということです。
実行例は
$ ls
main.f90 temp.d
$ gfortran main.f90
$ ./a.out
0
$
main.f90 temp.d
$ gfortran main.f90
$ ./a.out
0
$
となります。intel®fortranコンパイラでももちろんできます。
[adsense1]
ここより以下のものはaccess関数を用いない方法です。
ファイルをopenできたら存在する、errorが返ってきたら存在しない、と判断します。
そのプログラムとサブルーチンはこんな感じ。
program main
implicit none
integer::ox
call checkfile("temp.d",ox)
write(6,*)ox
stop
end program main
subroutine checkfile(fname,ox)
implicit none
character(*),intent(in)::fname
integer,intent(out)::ox
open(100,file=trim(fname),status='old',err=999)
close(100)
write(6,'(3A)')"file '",fname,"' exist"
ox=1
return
999 continue
close(100)
write(6,'(3A)')"file '",fname,"' don't exist"
ox=0
return
end subroutine checkfile
implicit none
integer::ox
call checkfile("temp.d",ox)
write(6,*)ox
stop
end program main
subroutine checkfile(fname,ox)
implicit none
character(*),intent(in)::fname
integer,intent(out)::ox
open(100,file=trim(fname),status='old',err=999)
close(100)
write(6,'(3A)')"file '",fname,"' exist"
ox=1
return
999 continue
close(100)
write(6,'(3A)')"file '",fname,"' don't exist"
ox=0
return
end subroutine checkfile
”ox”は〇×のつもりで使っています。
ファイル名”temp.d”をinputパラメータとして渡し、そのファイルが存在したらox=1を、存在しなかったらox=0を返します。
実行例は、
$ ls
temp.d main.f90
$ gfortran main.f90
$ ./a.out
file 'temp.d' exist
1
$ gfortran main.f90
$ ./a.out
file 'temp1.d' don't exist
0
temp.d main.f90
$ gfortran main.f90
$ ./a.out
file 'temp.d' exist
1
$ gfortran main.f90
$ ./a.out
file 'temp1.d' don't exist
0
となります。2回目の実行ではtemp.dをtemp1.dに変えて存在しない場合を表示しています。
[adsense2]