C++ 텍스트 모드 vs 바이너리 모드, 무엇이 다를까?
C++에서 파일 입출력은 크게 텍스트 모드(text mode)와 바이너리 모드(binary mode) 두 가지 방식으로 나뉩니다. 두 모드의 가장 큰 차이는 문자 변환(character translation) 여부입니다.
- 텍스트 모드: 개행 문자 등 특정 문자 변환이 자동으로 수행됩니다. 예를 들어 "\r\n"(캐리지 리턴 + 라인 피드) 조합이 "\n"으로 변환되어 처리됩니다.
- 바이너리 모드: 이러한 변환이 전혀 일어나지 않으며, 데이터가 원본 그대로 파일에 기록되거나 읽혀집니다.
주요 차이점 요약
| 구분 | 텍스트 모드 | 바이너리 모드 |
|---|---|---|
| 문자 변환 | 자동으로 수행됨 ("\r\n" → "\n") | 변환 없이 원본 그대로 유지 |
| 데이터 보존 | 운영체제에 따라 형식이 변경될 수 있음 | 완전한 원본 보존 |
| 적합한 용도 | 사람이 읽는 문서, 로그 파일 | 이미지, 실행 파일 등 원본 보존이 필요한 데이터 |
모드별 파일 입출력 코드 비교
1. 파일에 데이터 쓰기 (ofstream)
텍스트 모드:
ofstream ofs("file.txt");
// 또는
ofstream ofs;
ofs.open("file.txt");
바이너리 모드:
ofstream ofs("file.txt", ios::binary);
// 또는
ofstream ofs;
ofs.open("file.txt", ios::binary);
2. 파일 끝에 내용 추가하기 (append)
텍스트 모드:
ofstream ofs("file.txt", ios::app);
// 또는
ofstream ofs;
ofs.open("file.txt", ios::app);
바이너리 모드:
ofstream ofs("file.txt", ios::app | ios::binary);
// 또는
ofstream ofs;
ofs.open("file.txt", ios::app | ios::binary);
3. 파일 읽기 (ifstream)
텍스트 모드:
ifstream in("file.txt");
// 또는
ifstream in;
in.open("file.txt");
바이너리 모드:
ifstream in("file.txt", ios::binary);
// 또는
ifstream in;
in.open("file.txt", ios::binary);
마무리 정리
텍스트 모드는 사람이 직접 읽고 편집할 수 있는 문서나 로그 파일을 다룰 때 편리합니다. 반면 바이너리 모드는 이미지, 오디오, 실행 파일처럼 원본 데이터가 하나의 비트까지 그대로 보존되어야 하는 경우에 반드시 사용해야 합니다. 특히 Windows와 Linux처럼 개행 문자 규칙이 다른 플랫폼 간에 파일을 주고받는다면, 예상치 못한 데이터 손상을 막기 위해 바이너리 모드를 사용하는 것이 안전합니다.