FSEEK — 파일 위치 이동

FSEEK — 파일 위치 이동

파일을 읽다 보면 지금 위치를 옮겨서 특정 지점부터 다시 읽고 싶을 때가 있어요. C의 fseek처럼, FSEEK는 열려 있는 파일의 내부 위치를 지정한 오프셋만큼(또는 특정 기준점으로) 이동시켜 주는 저수준 서브루틴입니다.

출처: gfortran 공식 문서 - FSEEK

시그니처

CALL FSEEK(UNIT, OFFSET, WHENCE[, STATUS])

본문

설명(Description)

FSEEKUNIT을 지정한 OFFSET 위치로 이동시켜요. WHENCE0이면 OFFSET을 절대값으로 취하고(SEEK_SET), 1이면 현재 위치를 기준으로(SEEK_CUR), 2이면 파일 끝을 기준으로(SEEK_END) 해석합니다. 오류가 발생하면 STATUS에 0이 아닌 값이 설정돼요. STATUS가 없다면 실패해도 조용히 무시됩니다.

이 내장 루틴은 g77과 완전히 하위 호환이 되지는 않아요. g77에서는 FSEEKSTATUS 변수 대신 문장 라벨(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)

  • UNITINTEGER 타입의 스칼라여야 해요.
  • OFFSETINTEGER 타입의 스칼라여야 해요.
  • WHENCEINTEGER 타입의 스칼라여야 해요. 값은 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_SET0, SEEK_CUR1, SEEK_END2라는 매개변수 상수를 쓰면 뜻이 더 분명해져요.

표준(Standard)

GNU 확장(GNU extension)

더 알아보기

FTELL — 현재 스트림 위치