FSEEK — 파일 위치 이동
FSEEK — 파일 위치 이동
파일을 읽다 보면 지금 위치를 옮겨서 특정 지점부터 다시 읽고 싶을 때가 있어요. C의 fseek처럼, FSEEK는 열려 있는 파일의 내부 위치를 지정한 오프셋만큼(또는 특정 기준점으로) 이동시켜 주는 저수준 서브루틴입니다.
시그니처
CALL FSEEK(UNIT, OFFSET, WHENCE[, STATUS])
본문
설명(Description)
FSEEK는 UNIT을 지정한 OFFSET 위치로 이동시켜요. WHENCE가 0이면 OFFSET을 절대값으로 취하고(SEEK_SET), 1이면 현재 위치를 기준으로(SEEK_CUR), 2이면 파일 끝을 기준으로(SEEK_END) 해석합니다. 오류가 발생하면 STATUS에 0이 아닌 값이 설정돼요. STATUS가 없다면 실패해도 조용히 무시됩니다.
이 내장 루틴은 g77과 완전히 하위 호환이 되지는 않아요. g77에서는 FSEEK가 STATUS 변수 대신 문장 라벨(statement label)을 받았거든요. 예전 코드에서 FSEEK를 쓴다면 다음을
CALL FSEEK(UNIT, OFFSET, WHENCE, *label)
이렇게 바꿔 주세요.
INTEGER :: status
CALL FSEEK(UNIT, OFFSET, WHENCE, status)
IF (status /= 0) GOTO label
참고로 GNU Fortran은 Fortran 2003의 스트림 기능을 제공합니다. 새 코드에서는 향후 이식성을 위해 새 스트림 I/O 기능을 고려하세요. Fortran 2003 상태에 대한 자세한 내용은 관련 문서를 참고해요.
분류(Class)
서브루틴(Subroutine)
인자(Arguments)
UNIT—INTEGER타입의 스칼라여야 해요.OFFSET—INTEGER타입의 스칼라여야 해요.WHENCE—INTEGER타입의 스칼라여야 해요. 값은0,1,2중 하나여야 합니다.STATUS— (선택)INTEGER(4)타입의 스칼라여야 해요.
예제
PROGRAM test_fseek
INTEGER, PARAMETER :: SEEK_SET = 0, SEEK_CUR = 1, SEEK_END = 2
INTEGER :: fd, offset, ierr
ierr = 0
offset = 5
fd = 10
OPEN(UNIT=fd, FILE="fseek.test")
CALL FSEEK(fd, offset, SEEK_SET, ierr) ! move to OFFSET
print *, FTELL(fd), ierr
CALL FSEEK(fd, 0, SEEK_END, ierr) ! move to end
print *, FTELL(fd), ierr
CALL FSEEK(fd, 0, SEEK_SET, ierr) ! move to beginning
print *, FTELL(fd), ierr
CLOSE(UNIT=fd)
END PROGRAM
FSEEK로 파일 시작·끝·특정 오프셋으로 위치를 옮기고, 그때마다 FTELL로 현재 위치를 확인하는 예시예요. SEEK_SET은 0, SEEK_CUR은 1, SEEK_END는 2라는 매개변수 상수를 쓰면 뜻이 더 분명해져요.
표준(Standard)
GNU 확장(GNU extension)
더 알아보기
FTELL — 현재 스트림 위치