簡體   English   中英

Fortran 90 - 嘗試讀取文件末尾

[英]Fortran 90 - Attempt to read past end of file

我在Fortran 90中遇到了讀取問題。我正在嘗試讀取31488行數據。 我正在使用Portland Group Fortran 90編譯器。

我的錯誤信息是這樣的:

PGFIO-F-217 /列表定向讀/單元= 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)

通常,我們需要查看數據文件以確定您收到錯誤的原因。 列表導向輸入非常容易受到錯誤的影響,這些錯誤遠離檢測到錯誤的位置。 例如,錯誤報告在記錄31489,但是記錄7233可能在行上有一個太少的值 - 通過列表導向,它會自動讀取下一個記錄以獲取缺失的值,然后丟棄其余的新值線。 然后當它到達最后一條記錄時,它又想要一個......錯誤!

我相信問題出在數據文件中,而不是程序源。 您應該添加一些驗證以確保它實際上正在讀取您想要的值。 根據數據文件的格式化方式,我建議使用格式化的輸入格式而不是列表格式。 我已經看到太多的程序員被列表導向的輸入(和輸出)誤入歧途。

作為修復,您可以使用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中有一些構造我還沒有找到使用它的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM