web-dev-qa-db-ja.com

fortranランタイムエラーの取得:ファイルの終わり

私は最近、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を使用しています。

7
user3444034

報告するエラーの一般的な理由は、プログラムが開こうとしているファイルを見つけられないことです。プログラムが実行時にファイルを検索するディレクトリに関する仮定が間違っている場合があります。

試してください:

  • 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
3
user3206414

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)
2
Amir

私がコードを修正したすべてのあなたの助けに感謝します:

_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)に変更する必要があったので、ファイルがループに入っていたので、ファイルの最後に到達したときに何をすべきかがわかりました。

1
user3444034

次に、ファイルが行ベクトルであり、最初の要素を@ 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
0
Alf Pascu