私は最近、Fortranで基本的なファイルを操作する方法を学び、それは次のように単純だと思いました。
open(unit=10,file="data.dat")
read(10,*) some_variable, somevar2
close(10)
そのため、私が書いたこの関数が機能しない理由がわかりません。正常にコンパイルされますが、実行すると次のように出力されます。
fortran runtime error:end of file
コード:
Function Load_Names()
character(len=30) :: Staff_Name(65)
integer :: i = 1
open(unit=10, file="Staff_Names.txt")
do while(i < 65)
read(10,*) Staff_Name(i)
print*, Staff_Name(i)
i = i + 1
end do
close(10)
end Function Load_Names
Fortran 2008とgfortranを使用しています。
報告するエラーの一般的な理由は、プログラムが開こうとしているファイルを見つけられないことです。プログラムが実行時にファイルを検索するディレクトリに関する仮定が間違っている場合があります。
試してください:
open
ステートメントのerr=
オプションを使用して、見つからないファイルを適切に処理するコードを記述します。あなたが観察したように、これがないとプログラムはクラッシュします。または
inquire
ステートメントを使用して、プログラムが探しているファイルが存在するかどうかを確認します。ファイルがいつ終了したかを確認できます。これは、読み取りステートメントのオプションIOSTATを使用して実行されます。試してください:
Function Load_Names()
character(len=30) :: Staff_Name(65)
integer :: i = 1
integer :: iostat
open(unit=10, file="Staff_Names.txt")
do while(i < 65)
read(10,*, IOSTAT=iostat) Staff_Name(i)
if( iostat < 0 )then
write(6,'(A)') 'Warning: File containts less than 65 entries'
exit
else if( iostat > 0 )then
write(6,'(A)') 'Error: error reading file'
stop
end if
print*, Staff_Name(i)
i = i + 1
end do
close(10)
end Function Load_Names
Fortran 2003標準を使用すると、次の操作を実行して、ファイルの終わりに到達したかどうかを確認できます。
use :: iso_fortran_env
character(len=1024) :: line
integer :: u1,stat
open (newunit=u1,action='read',file='input.dat',status='old')
ef: do
read(u1,'A',iostat=stat) line
if (stat == iostat_end) exit ef ! end of file
...
end do ef
close(u1)
私がコードを修正したすべてのあなたの助けに感謝します:
_Function Load_Names(Staff_Name(65))!Loads Staff Names
character(len=30) :: Staff_Name(65)
integer :: i = 1
open(unit=10, file="Staff_Names.txt", status='old', action='read')!opens file for reading
do while(i < 66)!Sets Set_Name() equal to the file one string at a time
read(10,*,end=100) Staff_Name(i)
i = i + 1
end do
100 close(10)!closes file
return!returns Value
end Function Load_Names
_
read(10,*)
をread(10,*,END=100)
に変更する必要があったので、ファイルがループに入っていたので、ファイルの最後に到達したときに何をすべきかがわかりました。
次に、ファイルが行ベクトルであり、最初の要素を@ M.S.Bとして読み取った直後にこのエラーが発生する可能性があるという問題がありました。示唆していた。
NxMマトリックスを含むファイルがあり、それを次のように読み取る場合(F77):
DO i=1,N
DO j=1,M
READ(UNIT,*) Matrix(i,j)
ENDDO
ENDDO
行列の最初の行にファイルの最初の列をロードし、ファイルの最初の列の終わりに達するとすぐにエラーが発生します。これは、ループがそれ以上の行を読み取るように強制し、それ以上の行がないためです。 (N<M
いつ j=N+1
例えば)。さまざまな列を読み取るには、暗黙的なループを使用する必要があります。これが、ソリューションが機能した理由です。
DO i=1,N
READ(UNIT,*) (Matrix(i,j), j=1,M)
ENDDO