Fortran 90 - Attempt to read past end of file

12,312

Generally, we would need to see the data file in order to determine why you get the error. List-directed input is very susceptible to mistakes made a long ways away from where the error is detected. For example, the error is reported at record 31489, but maybe record 7233 had one too few values on the line - with list-directed, it would automatically read the next record to pick up the missing value and then discard the rest of that new line. Then when it gets to the last record, it wants one more and.. error!

I am fairly confident that the problem is in the data file, not the program source. You should add some verification to make sure it is actually reading the values you want. Depending on how your data file is formatted, I might recommend using formatted input with G format rather than list-directed. I have seen far too many programmers led astray by list-directed input (and output).

Share:
12,312
Admin
Author by

Admin

Updated on June 21, 2022

Comments

  • Admin
    Admin almost 2 years

    I am having a read issue in Fortran 90. I am attempting to read 31488 rows of data. I am using the Portland Group Fortran 90 compiler.

    My error message is this:

    PGFIO-F-217/list-directed read/unit=14/attempt to read past end of file. File name = /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt formatted, sequential access record = 31489

    The Fortran program thinks that I have an extra row. I do not know where that is indicated in the code.

    I have attached the relevant part of the code... I have searched high and low through this part of the code, I have investigated the text file to see if the number of rows match. I absolutely do not see where the problem lies.

    The compiler states that the error is located in the read statement... at read(14,*), that line of the code, within the do statements.

    Please help. Thank you very much.

    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)
    
  • Sam
    Sam over 10 years
    Good call on the list directed input woes.
  • Admin
    Admin over 10 years
    That was very insightful! Thank you much for your help! I will work on it more and see what is happening.
  • Vladimir F Героям слава
    Vladimir F Героям слава almost 9 years
    He may well not crash but still read garbage. BTW, you don't need labels, iostat= is your friend.
  • TrippLamb
    TrippLamb almost 9 years
    True, but you if your input file has bad data in it there is nothing he can do in the program to not get bad data anyways. Awesome, I hadn't come across "iostat=" before.