포맷 계약

바이너리는 파일 안에 작은 프로토콜을 만든다

바이트를 그대로 저장할수록 읽는 코드가 더 많은 약속을 책임집니다. 최소 포맷을 정하면 read() 실패와 플랫폼 차이를 추적하기 쉬워집니다.

magic

식별자

내 파일인지 먼저 확인합니다.

version

버전

구조 변경을 분기합니다.

count

개수

반복 읽기 범위를 정합니다.

record

고정 레코드

sizeof(T)만큼 건너뛰어 원하는 레코드의 바이트 위치를 계산합니다.

payload

가변 데이터

길이 뒤에 실제 바이트를 둡니다.

[header] -> [record 0] [record 1] ... -> [length][bytes]
          seekg(base + index * sizeof(Record))
write

쓰기 규칙

필드 순서와 크기를 고정하고, 문자열은 객체 자체가 아니라 길이와 내용을 씁니다.

read

읽기 규칙

헤더 검증 후 필요한 바이트 수를 읽었는지 확인하고, 실패하면 부분 객체를 버립니다.

skip

저장 금지

포인터 주소, 패딩에 의존한 구조체, 실행 중 메모리 배치는 파일 포맷으로 삼지 않습니다.