Fortran 90-尝试读取超过文件结尾的内容

Fortran 90-尝试读取超过文件结尾的内容,fortran,runtime-error,Fortran,Runtime Error,我有一个Fortran 90的阅读问题。我正在尝试读取31488行数据。我正在使用波特兰集团Fortran 90编译器 我的错误消息如下: PGFIO-F-217/列表定向读取/unit=14/尝试读取超过文件末尾的内容。 文件名=/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt格式,顺序访问record=31489 Fortran程序认为我有一个额外的行。我不知道代码中指明的位置 我已附上代码的相关部分。。。我在代码的这一部分上下

我有一个Fortran 90的阅读问题。我正在尝试读取31488行数据。我正在使用波特兰集团Fortran 90编译器

我的错误消息如下:

PGFIO-F-217/列表定向读取/unit=14/尝试读取超过文件末尾的内容。 文件名=/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt格式,顺序访问record=31489

Fortran程序认为我有一个额外的行。我不知道代码中指明的位置

我已附上代码的相关部分。。。我在代码的这一部分上下搜索了一遍,我调查了文本文件以查看行数是否匹配。我绝对看不出问题出在哪里

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

请帮忙。多谢各位

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)
编程技巧
! 目的:计算技能得分
隐式无
整数::i,j,nsite,ntime,iref,jj,csite
! nsite=观察点数量,CSITE=化学点数量,ntime=小时数
参数(nsite=32,csite=1,ntime=984)
real::Tob(nsite,ntime)、RHo(nsite,ntime)、diro(nsite,ntime)
雷诺(nsite,ntime)、swo(nsite,ntime)、po(nsite,ntime)
实时:Tdo(nsite,ntime),vo(nsite,ntime)
真实::Ts(nsite,ntime)、RHs(nsite,ntime)、dirs(nsite,ntime)
雷亚尔:雨(nsite,ntime),雨水(nsite,ntime),雨水(nsite,ntime)
真实:Tds(nsite,ntime),vs(nsite,ntime)
real::PMo(csite,ntime),PMs(csite,ntime)
real::pers(csite、ntime)
真实::偏差、rmse、sde、r、x、y、sx、sy、dw、isig
实数
真实:nrmse、fac2、nstdev、mg、fb、nmse
real::biast(ntime)、rmset(ntime)、sdet(ntime)
实时::rt(ntime)、xt(ntime)、yt(ntime)
real::sxt(ntime)、syt(ntime)、isigt(ntime)、countt(ntime)、dt(ntime)
! 打开文件读取观测数据
打开(14,文件)=&
“/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt”&
form=“formatted”,status=“old”)
Tob=-999。
RHo=-999。
vo=-999。
迪罗=-999。
雷诺=-999。
swo=-999。
po=-999。
时差=-999。
i=1,nsite吗
do j=1,n时间
阅读(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)通常,我们需要查看数据文件以确定出现错误的原因。列表导向的输入非常容易受到远离错误检测位置的错误的影响。例如,错误报告在记录31489,但可能记录7233的行上有一个太少的值-使用列表导向,它将自动读取下一条记录以提取丢失的值,然后丢弃新行的其余部分。然后当它到达最后一条记录时,它需要再读取一条,并且..错误


我很有信心问题出在数据文件上,而不是程序源。你应该添加一些验证,以确保它确实读取了你想要的值。根据数据文件的格式,我可能建议使用G格式的格式化输入,而不是列表定向输入。我见过太多程序员使用astr按列表定向输入(和输出)方式读取。

作为修复方法,您可以使用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
do i=1,nsite
do j=1,n时间
读(14,*,end=10)Tob(i,j),RHo(i,j),vo(i,j),diro(i,j)&
雷诺(i,j)、swo(i,j)、po(i,j)、Tdo(i,j)

if(vo(i,j)这是一个很好的列表定向输入问题。非常有见地!非常感谢你的帮助!我会继续努力,看看会发生什么。他可能不会崩溃,但仍然会读垃圾。顺便说一句,你不需要标签,
iostat=
是你的朋友。没错,但是如果你的输入文件中有坏数据,他在pr中也无能为力无论如何,我都不会得到坏数据。太棒了,我以前从未遇到过“iostat=”。