2016-11-27 3 views
1

나는 84480 라인의 데이터 파일을 가지고 있는데, 각각을 4224 라인을 갖는 서브 루틴에서 20 개의 다른 파일로 나눕니다. 이제이 파일을 다른 서브 루틴에서 하나씩 사용하여 몇 가지 분석을 수행하려고합니다. 하지만 시도했을 때, 런타임 오류가 발생했습니다 : 파일 끝. 여기 런타임 오류 : 파일 끝

메인 프로그램 여기

real (kind = 8) :: x(84480),y(84480),x1(4424),y1(4424) 
open(1000,file='datafile.txt',status='old') 
n = 20   ! number of configurations 
m = 84480  ! total number of lines in all configurations 
p = 4224  ! number of lines in a single configuration 
no = 100  ! starting file number configurations 
do i=1,m 
    read(1000,*) x(i),y(i) 
end do 
call split(x,y,m,n) 
do i = 1,20 
    open(no) 
    do j = 1,p 
     read(no,*) x1(j),y1(j) ! error is occurring in here 
    end do 
    no = no + 1 
end do 
end 

의 구조는이 서브 루틴에 fort.119fort.100 정확하게 출력 파일을 생산

subroutine split(x,y,m,n) 
integer , intent (in) :: m,n 
real (kind = 8) , intent(in) :: x(m),y(m) 
integer :: i,k,j,p 
p = 100 
do i=0,n-1 
    k = i*4224 
    do j = k+1,k+4224 
     write(p,*) x(j),y(j) 
    end do 
    p = p + 1 
end do 
end subroutine split 

에게 서브 루틴이다. 하지만 내가 잘못 가고 다음과 같은 오류

unit = 100, file = 'fort.100' Fortran runtime error: End of file

보여줍니다?

+0

각 파일의 끝에 빈 줄을 쓰십시오. 또한 읽기주기에서 "아니오"파일을 닫으십시오. –

+0

'@ MichaelO.' 아니요, 작동하지 않습니다.같은 오류가 다시 나타납니다. – Joe

+0

그럼 각 파일의 이름을 명시 적으로 지정해야합니다. –

답변

1

여기는 파일 연결입니다. 이 프로그램은 두 가지 연결 형식을 사용합니다 : 사전 연결open 문. 여기서 datafile.txt에 대한 연결을 무시합니다.

우리는 장치 번호 p는 이전에 open 문에되지 않았습니다

write(p,*) x(j),y(j) 

과 서브 루틴에 preconnection를 참조하십시오. 기본 파일 이름은 fort.100 (등)입니다.

서브 루틴이 호출 된 후 20 개의 사전 연결 단위에는 각각 데이터가 기록됩니다. 각 연결은 파일 끝에 있습니다. 이것은 주목할만한 부분입니다.

이미 파일에 연결되는 장치 번호와의 접속을 개방 접속을 종료하지 않았기 때문에 서브 루틴 후, 우리는

open(no) 

우리가 가진 루프 올

. 이것은 완벽하게 수용 가능합니다. 그러나 우리는 이것이 무엇을 의미하는지 이해해야합니다.

open(no)에는 파일 지정자가 없으므로 장치가 이전에 연결된 파일에 연결되어 있음을 의미합니다. 다른 지정자는 없으므로 연결에 대한 내용은 변경되지 않습니다. 특히, 연결은 재배치되지 않습니다 : 우리는 여전히 각 파일의 끝에 있습니다.

그래서 우리는 파일의 끝에 위치 할 때 파일을 읽으려고합니다. 결과 : 파일 오류가 발생했습니다.

이제 어떻게 해결할 수 있습니까?

한 가지 방법은 연결의 위치를 ​​변경하는 것입니다. open(no, position='rewind')을 원할 수도 있지만 그렇게 할 수는 없습니다. 질문에 대한 코멘트에 제안, 우리는 독서에 대한 각각의 연결을 종료하고 (명시 적 position='rewind'과) 루프에 다시 할 수 있지만, 다른 방법으로

rewind no ! An unfortunate unit number name; could also be rewind(no). 

있습니다.

+0

@'francescalus' 대단히 감사합니다. – Joe

관련 문제