Fortran-90 - Versuch zum Lesen hinter Dateiende
Ich bin eine lese-Problem in Fortran-90. Ich bin versucht zu Lesen 31488 Zeilen von Daten. Ich bin mit der Portland Group Fortran-90-compiler.
Meine Fehlermeldung ist diese:
PGFIO-F-217/list-directed Lesen/Einheit=14/versuchen zu Lesen hinter Dateiende.
Dateiname = /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt formatiert, sequential access Datensatz = 31489
Fortran-Programm denkt, dass ich eine zusätzliche Zeile. Ich weiß nicht, wo das angegeben ist in den code.
Ich angehängt habe den relevanten Teil des Codes... ich habe gesucht hoch und niedrig durch diesen Teil des Codes habe ich untersucht der text-Datei angezeigt, wenn die Anzahl der Zeilen entsprechen. Ich absolut nicht sehen, wo das problem liegt.
Den compiler besagt, dass der Fehler liegt in der read-Anweisung... zu Lesen(14,*) ist, dass der code innerhalb der do-Anweisungen.
Bitte helfen. Ich danke Ihnen sehr.
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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel, wir würden sehen müssen, die Daten-Datei, um festzustellen, warum Sie den Fehler. Liste gerichtete Eingabe ist sehr anfällig für Fehler, die aus einem langen Weg aus, wo der Fehler erkannt wird. Zum Beispiel der Fehler bei Datensatz 31489, aber vielleicht Aufzeichnung 7233 hatte man zu wenige Werte auf der Strecke - mit Liste-richten, würde es automatisch Lesen Sie den nächsten Datensatz zu Holen, wird der fehlende Wert aus und entsorgen Sie den rest der neuen Zeile. Dann, wenn es um den letzten Datensatz, es will man mehr und.. Fehler!
Ich bin ziemlich zuversichtlich, dass das problem in der Daten-Datei, nicht die Programm-Quelle. Sollten Sie einige überprüfung, um sicherzustellen, es ist tatsächlich beim Lesen der Werte, die Sie möchten. Je nachdem, wie Sie Ihre Daten-Datei formatiert ist, könnte ich empfehlen, formatierte Eingabe mit G-format statt-geleitet. Ich habe gesehen, viel zu viele Programmierer led Irre, durch list-directed-Eingang (und Ausgang).
Als Korrektur können Sie die Fortran-Entsprechung zu Lesen, um das Ende einer Datei.
Als eine Regel, die ich in der Regel versuchen zu vermeiden, goto-Anweisungen, sondern in Fortran gibt es einige Konstrukte, habe ich noch einen Weg finden, um mit einer.
iostat=
ist dein Freund.