2017-03-15 2 views
1

나는이 오류 팝업이 나타나고 이것이 일어나고 있는지 확신하지 못합니다. 나는 다음과 같은 데이터를 읽으려고 해요 :서식있는 배열 만들기 Fortran ... 파일 오류 끝

1 0000 1234 
2 0032 8383 
3 1201 3983 
4 1234 9292 
5 4567 9202 
6 7890 8382 
7 2324 9383 

처음 4 줄을 건너 뛰는, 별도의 배열의 두 번째 열에서 정수를 읽고 (그래서 하나 개의 어레이는 4567, 7890, 2324을 생산하고, 다른이 9202, 8382 및 9383 생산). 아래는 내가 가지고있는 코드 :

Program test 
Implicit None 
integer :: i 
integer, parameter :: & 
m=7, & !total number of line 
n=4, & !line to skip 
p=3  !lines to read 
integer,dimension(m)::arr, arr2 !file to read 

open(12,file='something.txt',status='old') 
10 format (T5, I4) 
do i=1,n 
read(12,10)arr(i) 
end do 
do i=1,p 
read(12,10)arr(i) 
write(*,*)arr(i) 
end do 

20 format (T11, I4) 
do i=1,n 
read(12,20)arr2(i) 
end do 
do i=1,p 
read(12,20)arr2(i) 
write(*,*)arr2(i) 
end do 
End Program test 

첫 번째 배열이 올바르게에서 읽을 수는 있지만,이 두 번째에 도달하면, 파일 오류의 끝 (22)가 오는 줄에서 발생합니다. 저는 Fortran을 처음 접했기 때문에 왜 이런 일이 일어나는지 잘 모르겠습니다.

+1

아마도 어레이 판독 값 사이에 '되감기'가 누락되었을 수 있습니다. 즉, 만약 내가 이것을 쓰고 있었다면 나는 파일의 한 패스로 그것을 할 것이고'T' 편집을 사용하지 않을 것이라고 말했다. – francescalus

+0

은 더미 정수 ('d')를 선언하고 각 행 목록을'read (12, *) d, arr (i), arr2 (i)'로 지시합니다. – agentp

답변

0

서식이 지정된 파일에서 read을 수행하면 프로그램이 전체 줄을 읽고 앞으로 이동합니다.

기본적으로 arr을 완전히 읽은 후 포인터는 파일의 끝을 가리키며 그 곳에서 arr2으로 읽는 위치가 시작됩니다.

두 가지 중 하나를 수행 할 수 있습니다 둘 사이

  1. rewind 파일을 읽습니다.
  2. 두 배열을 동시에 읽습니다.

두 번째 해결책은 파일을 두 번 읽지 않으므로 더 좋습니다. 다음은 예입니다 :

program test 

    implicit none 
    integer :: i 
    integer, parameter :: & 
     m=7, & 
     n=4, & 
     p=m-n 

    integer :: arr(p), arr2(p) 

    open(unit=12, file='something.txt', action='READ', status='OLD') 

    do i = 1, n 
     read(12, "()") 
    end do 

    do i = 1, p 
     read(12, '(4X, I4, 2X, I4)') arr(i), arr2(i) 
    end do 

    close(12) 

    print*, arr 
    print*, arr2 

end program test 

나는 개인적으로 두 가지 할 것 :

  1. 는 더미 정수 변수를 선언 한 다음

    read(12, *) dummy, arr(i), arr2(i) 
    

    를 사용하는 대신에 형식을 주위에 일 처리 읽기 read 성명

  2. 모든 파일 I/O에 대해 항상 iostat 매개 변수의 결과를 확인하여 모든 것이 의도 한대로 작동하는지 확인합니다.

+0

설명해 주셔서 감사합니다! 이것은 지금 훨씬 더 의미가 있습니다! 추가 질문 : 파일을 두 번 읽는다면 내가 언급 한 두 가지 해결책 중에서 무엇이 더 좋았습니까? – cdmck004

+0

다시 : 파일 I/O는 메모리 I/O보다 훨씬 느리므로이를 권고합니다. 즉, 코드에서'20 format (T11, I4)'줄 바로 앞에'되감기 (12)'를 추가하면 작동합니다. – chw21