Binary I/O Checklist

안정적인 바이너리 파일은 데이터보다 형식을 먼저 저장한다

struct를 그대로 쓰면 빨라 보이지만, padding, endian, 버전 차이가 생기는 순간 읽기 규칙이 흔들립니다. 오래 쓸 파일은 포맷을 먼저 정합니다.

그대로 복사

struct bytespadding?local endian?

같은 컴파일러와 같은 구조체일 때만 우연히 잘 읽힐 수 있습니다.

포맷으로 저장

magicversionlengthpayloadchecksum

읽는 쪽이 먼저 파일 종류와 해석 규칙을 검증할 수 있습니다.

1 headermagic, version, endian을 맨 앞에 둡니다.
2 field정수 크기, 부호, 문자열 길이를 고정합니다.
3 payload레코드 수와 각 레코드 경계를 명시합니다.
4 validate읽은 바이트 수와 checksum을 확인합니다.
5 migrate버전별 읽기 경로를 남깁니다.
ios::binary텍스트 변환을 막고 바이트를 그대로 읽습니다.
endian표준 바이트 순서를 정해 다른 환경에서도 복원합니다.
length부분 파일과 잘린 파일을 조기에 걸러냅니다.
version필드 추가와 포맷 변경을 읽기 코드가 분기합니다.
길이 확인write와 read byte 수가 기대와 같은지 매번 확인합니다.
교차 환경다른 OS, compiler, endian 환경을 고려해야 하는 파일인지 판단합니다.
손상 파일checksum 실패나 버전 불일치를 안전하게 거부합니다.
바이너리 파일의 안정성은 write() 호출이 아니라, 미래의 읽기 코드가 같은 형식으로 해석할 수 있는지에서 결정됩니다.