2013-08-01 88 views
4

我在Fortran 90中讀取問題。我試圖讀取31488行數據。我正在使用Portland Group Fortran 90編譯器。Fortran 90 - 嘗試讀取文件的末尾

我的錯誤信息是這樣的:

PGFIO-F-217 /列表式讀/單元= 14 /嘗試讀取過去的文件結束。 文件名= /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt格式,順序訪問紀錄= 31489

Fortran程序認爲我有一個額外的行。我不知道代碼中的位置。

我附上了代碼的相關部分...我已經通過這部分代碼搜索高低,我調查了文本文件以查看行數是否匹配。我絕對不知道問題出在哪裏。

編譯器聲明錯誤位於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) 

回答

7

通常,我們需要查看數據文件以確定爲什麼會出現錯誤。列表導向輸入非常容易受到錯誤檢測距離較遠的錯誤的影響。例如,錯誤報告記錄在31489,但是記錄7233可能有一行數值太少 - 使用列表定向,它會自動讀取下一條記錄來提取缺失的值,然後丟棄其餘的新數據線。然後,當它到達最後一個記錄時,它需要一個,並且..錯誤!

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

+1

良好的呼叫列表指示輸入的困境。 – user7116

+0

這非常有見地! 非常感謝您的幫助!我會更多地研究它,看看發生了什麼。 –

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中有一些結構我還沒有找到解決使用一個辦法。

+1

他可能不會崩潰,但仍然閱讀垃圾。順便說一句,你不需要標籤,'iostat ='是你的朋友。 –

+0

確實如此,但是如果你的輸入文件中有不好的數據,那麼在程序中沒有任何事情可以做到不會弄壞數據。太棒了,我之前沒有遇到過「iostat =」。 –