获取fortran运行时错误:文件结束

时间:2014-03-22 22:10:00

标签: runtime fortran gfortran

我最近学会了如何使用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。

6 个答案:

答案 0 :(得分:6)

您报告错误的常见原因是程序找不到它尝试打开的文件。有时,您对程序在运行时查找文件的目录的假设是错误的。

尝试:

  • 使用err=语句中的open选项编写代码以优雅地处理丢失的文件;没有这个,程序会崩溃,正如你所观察到的那样;

  • 使用inquire语句确定文件是否存在于程序所在的位置。

答案 1 :(得分:3)

您可以检查文件何时结束。它使用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

答案 2 :(得分:2)

使用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)

答案 3 :(得分:1)

感谢您帮助我修复了代码:

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) 因此它知道在文件结束时该怎么做 因为它是在循环中我假设。

答案 4 :(得分:0)

然后您的问题是您的文件是行向量,并且很可能 在读取第一个元素后立即为您提供此错误,例如@ 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

答案 5 :(得分:0)

我在Ubuntu系统16.04上使用GNU Fortran 5.4.0。请检查您的文件是否正确,因为有时同名文件会造成混淆,并且其中之一可能为空白。您可能会检查文件路径是否在同一工作目录中。