Fortran 90 - 尝试读取文件末尾

时间:2013-08-01 20:11:07

标签: fortran runtime-error

我在Fortran 90中遇到了读取问题。我正在尝试读取31488行数据。我正在使用Portland Group Fortran 90编译器。

我的错误信息是:

PGFIO-F-217 / list-directed read / unit = 14 /尝试读取文件的结尾。  文件名= /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt格式化,顺序访问记录= 31489

Fortran计划认为我有一个额外的行。我不知道代码中的位置。

我附上了代码的相关部分......我通过这部分代码搜索了高低,我调查了文本文件以查看行数是否匹配。我绝对不知道问题出在哪里。

编译器声明错误位于read语句中... read(14,*),代码的那一行,在do语句中。

请帮忙。非常感谢你。

Program skillruss
! Purpose: to calculate skill scores

implicit none
integer :: i,j,nsite,ntime,iref,jj,csite

! nsite = number of observation sites, csites = number of chemical sites, ntime = number of hours

parameter(nsite=32,csite=1,ntime=984)

real :: Tob(nsite,ntime),RHo(nsite,ntime),diro(nsite,ntime)
real :: raino(nsite,ntime),swo(nsite,ntime),po(nsite,ntime)
real :: Tdo(nsite,ntime),vo(nsite,ntime)
real :: Ts(nsite,ntime),RHs(nsite,ntime),dirs(nsite,ntime)
real :: rains(nsite,ntime),sws(nsite,ntime),ps(nsite,ntime)
real :: Tds(nsite,ntime),vs(nsite,ntime)
real :: PMo(csite,ntime),PMs(csite,ntime)

real :: pers(csite,ntime)
real :: bias,rmse,sde,r,x,y,sx,sy,dw,isig
real :: countn
real :: nrmse,fac2,nstdev,mg,fb,nmse
real :: biast(ntime),rmset(ntime),sdet(ntime)
real :: rt(ntime),xt(ntime),yt(ntime)
real :: sxt(ntime),syt(ntime),isigt(ntime),countt(ntime),dt(ntime)


! Open file to read the observational data

open(14,file=&
"/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt",&
   form="formatted",status="old")

Tob= -999.
RHo= -999.
vo= -999.
diro= -999.
raino= -999.
swo= -999.
po= -999.
Tdo= -999.

do i=1,nsite
do j=1,ntime
read(14,*) Tob(i,j),RHo(i,j),vo(i,j),diro(i,j),raino(i,j),swo(i,j),&
    po(i,j),Tdo(i,j)
if(vo(i,j) <=0.)diro(i,j)=-999.
end do
end do
close(14)

2 个答案:

答案 0 :(得分:8)

通常,我们需要查看数据文件以确定您收到错误的原因。列表导向输入非常容易受到错误的影响,这些错误远离检测到错误的位置。例如,错误报告在记录31489,但是记录7233可能在行上有一个太少的值 - 通过列表导向,它会自动读取下一个记录以获取缺失的值,然后丢弃其余的新值线。然后当它到达最后一条记录时,它又想要一个......错误!

我相信问题出在数据文件中,而不是程序源。您应该添加一些验证以确保它实际上正在读取您想要的值。根据数据文件的格式化方式,我建议使用格式化的输入格式而不是列表格式。我已经看到太多的程序员被列表导向的输入(和输出)误入歧途。

答案 1 :(得分:0)

作为修复,您可以使用Fortran等效文件来读取文件的末尾。

do i=1,nsite
    do j=1,ntime
        read(14,*, end=10)Tob(i,j),RHo(i,j),vo(i,j),diro(i,j),&
                          raino(i,j),swo(i,j),po(i,j),Tdo(i,j)
        if(vo(i,j) <=0.)diro(i,j)=-999.
    end do
end do
10   continue

作为一项规则,我通常会尽量避免使用goto语句,但在Fortran中有一些构造我还没有找到使用它的方法。