텍스트 파일 쓰기

C++ 텍스트 파일 쓰기

ofstream에 문자열을 넣는 예제만으로 파일 쓰기를 이해하면 운영에서 조용히 실패한다. 파일을 어떤 mode로 여는지, 기존 내용을 덮을지 append할지, 버퍼가 언제 flush되는지, failbit와 예외 설정을 어떻게 확인할지 정해야 한다.

01

경로와 모드 선택

새로 덮어쓸지, 뒤에 붙일지, 기존 파일이 없을 때 만들지 open mode를 정한다.

기본 out은 보통 trunc로 기존 내용을 지운다
02

열기 상태 확인

is_open과 stream 상태를 확인해 권한, 경로, 디스크 오류를 놓치지 않는다.

열기 실패 후 쓰기는 조용히 실패할 수 있다
03

형식 지정

줄바꿈, 구분자, locale, precision을 명확히 해 다시 읽을 수 있는 텍스트를 만든다.

사람용 로그와 기계용 파일은 형식이 다르다
04

버퍼 처리

flush와 close 시점을 이해하고 프로그램 종료 전 데이터가 디스크로 전달되는지 확인한다.

flush는 성공 보장을 뜻하지 않는다
05

원자적 교체

설정 파일처럼 깨지면 안 되는 데이터는 임시 파일에 쓰고 rename으로 교체한다.

중간 실패가 기존 파일을 망치지 않게 한다
trunc
기존 내용 삭제 전체 파일을 새 내용으로 교체할 때 사용한다.
실수로 로그를 날릴 수 있다
app
끝에 추가 로그처럼 기존 내용을 보존하며 뒤에 붙일 때 사용한다.
동시 쓰기와 줄 단위 원자성을 확인한다
failbit
논리적 실패 형식 변환이나 열기 실패처럼 스트림 작업이 실패한 상태다.
상태 확인 없이는 놓친다
temp+rename
안전한 교체 새 파일을 완성한 뒤 이름을 바꿔 기존 파일 손상을 줄인다.
운영 설정 저장의 손상 범위를 줄인다

쓰기 확인

권한 실패 쓰기 권한이 없는 경로에서 실패를 감지하는지 확인한다.
덮어쓰기 기존 파일이 있을 때 trunc와 app 동작이 의도와 맞는지 본다.
부분 파일 중간 실패 후 기존 파일이 깨지지 않는지 임시 파일 전략을 확인한다.