【问题标题】:Fortran 90 - Attempt to read past end of fileFortran 90 - 尝试读取文件末尾
【发布时间】:2013-08-02 22:33:39
【问题描述】:

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

我的错误信息是这样的:

PGFIO-F-217/list-directed read/unit=14/试图读取文件末尾。 文件名 = /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt 格式,顺序访问 record = 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)

【问题讨论】:

    标签: fortran runtime-error


    【解决方案1】:

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

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

    【讨论】:

    • 良好调用列表定向输入问题。
    • 这很有见地!非常感谢您的帮助!我会继续努力,看看会发生什么。
    【解决方案2】:

    作为修复,您可以使用 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 中,有一些结构我还没有找到解决方法。

    【讨论】:

    • 他很可能不会崩溃,但仍然会读垃圾。顺便说一句,你不需要标签,iostat= 是你的朋友。
    • 是的,但是如果您的输入文件中包含错误数据,那么他在程序中无能为力以不获取错误数据。太棒了,我以前没有遇到过“iostat=”。
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2011-08-07
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多