비정형 순차 파일의 파일 형식

비정형 순차 파일의 파일 형식

비정형(unformatted) 순차 파일이 실제로 디스크에 어떻게 저장되는지 궁금할 때가 있죠. GNU Fortran은 레코드 마커(record marker)로 논리 레코드를 기록해요. 파일이 어떻게 구성되는지, 그리고 2GiB가 넘는 레코드를 어떻게 다루는지 이 장에서 설명할게요.

출처: File format of unformatted sequential files (The GNU Fortran Compiler)

본문

비정형 순차 파일은 레코드 마커를 사용해 논리 레코드로 저장돼요. 각 논리 레코드는 하나 이상의 서브레코드(subrecord)로 구성돼요.

각 서브레코드는 앞의 레코드 마커, 사용자 프로그램이 쓴 데이터, 뒤의 레코드 마커로 구성돼요. 레코드 마커는 기본적으로 4바이트 정수이고, -fmax-subrecord-length=8 옵션(호환성을 위해서만 존재)이 적용되면 8바이트 정수예요.

레코드 마커의 표현은 -fconvert 옵션으로 주어지는 비정형 파일, OPEN 문의 CONVERT 지정자, 또는 GFORTRAN_CONVERT_UNIT — 비정형 I/O 변환 설정 환경 변수의 표현과 같아요.

서브레코드에 담기는 사용자 데이터의 최대 바이트 수는, 4바이트 레코드 마커 기준으로 2147483639 (2 GiB - 9)예요. 이 제한은 -fmax-subrecord-length 옵션으로 낮출 수 있지만 거의 쓰이지 않아요. 논리 레코드의 길이가 이 제한을 넘으면 데이터가 여러 서브레코드에 나뉘어 배치돼요.

레코드 마커에 저장된 숫자의 절댓값은 해당 서브레코드의 사용자 데이터 바이트 수예요. 서브레코드의 앞 레코드 마커에 음수가 들어 있으면 현재 서브레코드 뒤에 다른 서브레코드가 이어져요. 뒤 레코드 마커에 음수가 들어 있으면 앞에 서브레코드가 있다는 뜻이에요.

가장 단순한 경우, 논리 레코드당 서브레코드가 하나뿐이면 두 레코드 마커 모두 레코드의 사용자 데이터 바이트 수를 담아요.

비정형 순차 데이터의 형식은 비정형 스트림(unformatted stream)으로도 복제할 수 있어요. 다음 예제 프로그램처럼 단일 서브레코드를 담은 비정형 레코드를 보면요:

program main
  use iso_fortran_env, only: int32
  implicit none
  integer(int32) :: i
  real, dimension(10) :: a, b
  call random_number(a)
  open (10,file='test.dat',form='unformatted',access='stream')
  inquire (iolength=i) a
  write (10) i, a, i
  close (10)
  open (10,file='test.dat',form='unformatted')
  read (10) b
  if (all (a == b)) print *,'success!'
end program main

더 알아보기