2013-08-01 1 views
4

Fortran 90에서 읽는 데 문제가 있습니다. 31488 행의 데이터를 읽으려고합니다. 포틀랜드 그룹 포트란 90 컴파일러를 사용하고 있습니다. Fortran 90 - 파일 끝을 읽으려고 시도했습니다.

PGFIO-F-217/목록 지시 읽기/단위 = 14/시도

파일 과거의 끝을 읽으려면 :

내 오류 메시지가 이것이다. = /import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt 포맷 파일 이름, 순차 액세스 기록 = 31489

포트란 프로그램은 내가 여분의 행을 가지고 생각합니다. 그 코드에 어디에 표시되어 있는지 모르겠습니다.

코드의 관련 부분을 첨부했습니다 ... 코드의이 부분을 통해 높게 및 낮게 검색했습니다. 행 수가 일치하는지 확인하기 위해 텍스트 파일을 조사했습니다. 나는 문제가 어디에 있는지 절대 알지 못한다.

컴파일러는 오류가 read 문 ... do 문 내에있는 코드의 해당 줄 read (14, *)에 있음을 나타냅니다.

도와주세요. 고맙습니다.

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에 행에 너무 적은 값이있는 경우 - 목록 지시와 함께 다음 레코드를 자동으로 읽으면 누락 된 값을 선택하고 나머지는 버립니다 선. 그런 다음 마지막 레코드에 도달하면 더 많은 것을 원하며 오류가 발생합니다!

문제가 프로그램 소스가 아니라 데이터 파일에 있음을 확신합니다. 원하는 값을 실제로 읽고 있는지 확인하기 위해 몇 가지 확인을 추가해야합니다. 데이터 파일의 형식에 따라 목록 형식이 아닌 G 형식의 입력을 사용하는 것이 좋습니다. 필자는 너무 많은 프로그래머가 목록 지향 입력 (및 출력)으로 길을 잃는 것을 보았습니다.

+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 

하지만, 포트란에 내가 하나를 사용하여 주위에 방법을 찾아 아직했습니다 몇 가지 구조가 있습니다.

+1

그는 충돌하지는 않지만 여전히 쓰레기를 읽을 수 있습니다. BTW, 당신은 라벨이 필요 없어요,'iostat ='당신의 친구입니다. –

+0

사실, 입력 파일에 불량 데이터가있는 경우 프로그램에서 불량 데이터를 가져 오지 못하게 할 수있는 방법이 없습니다. 신난다, 나는 전에 "iostat ="을 만나지 않고 있었다. –

관련 문제