我最近学会了如何使用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。
答案 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。请检查您的文件是否正确,因为有时同名文件会造成混淆,并且其中之一可能为空白。您可能会检查文件路径是否在同一工作目录中。