파일 입출력시 형성할 수 있는 스트림의 종류는 훨씬 더 다양하다.
기본적으로 다음 두 가지 기준을 통해서 스트림을 구분
기준 1 : 읽기 위한 스트림 or 쓰기 위한 스트림
기준 2 : 텍스트 데이터를 위한 스트림? 바이너리 데이터를 위한 스트림
스트림을 구분하는 기준1: 읽기 위한 스트림? 쓰기 위한 스트림?
스트림을 구분하는 기준
데이터 READ 스트림 | 읽기만 가능 |
데이터 WRITE 스트림 | 쓰기만 가능 |
데이터 APPEND 스트림 | 쓰되 덧붙여 쓰기만 가능 |
데이터 READ/WRITE 스트림 | 읽기, 쓰기 모두 가능 |
모드(mode) | 스트림 성격 | 파일이 없으면? |
r | 읽기 가능 | 에러 |
w | 쓰기 가능 | 생성 |
a | 파일의 끝에 덧붙여 쓰기 가능 | 생성 |
r+ | 읽기/쓰기 가능 | 에러 |
w+ | 읽기/쓰기 가능 | 생성 |
a+ | 읽기/덧붙여 쓰기 가능 | 생성 |
필요로 하는 스트림의 특성과 일치하는 '파일의 개방 모드(mode)'를 선택하면 된다.
모드의 이름이 fopen 함수의 두 번째 인자.
- 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성
- 모드의 a는 쓰기(덧붙이기)가 가능한 스트림
참고
웬만하면 r, w, a 중에서 선택
- 파일의 개방 모드 중 r+, w+, a+는 읽기와 동시에 쓰기가 가능하므로 더 좋은 모드라고 생각할 수 있다.
- 그러나 이러한 모드를 기반으로 작업하는 경우에는 읽기에서 쓰기, 그리고 쓰기에서 읽기로 그리고 쓰기에서 읽기로 작업을 변경할 때마다 메모리 버퍼를 비워줘야 하는 등의 불편함과 더불어 잘못될 사용의 위험성도 따름
- 그래서 r, w, a 중에서 하나를 선택하여 스트림을 형성하는 것이 좋으며, 이것이 보다 일반적인 선택이다.
텍스트 파일과 바이너리 파일
스트림을 구분하는 두 번째 기준
파일에 담을 수 있는 데이터들의 유형
개인이 소유하는 도서의 목록 | 문자 데이터 |
슈퍼마켓의 물품 가격 | 문자 데이터 |
타이타닉 영상파일 | 바이너리 데이터 |
히트곡 음원파일 | 바이너리 데이터 |
텍스트 파일(text file) : 사람이 인식할 수 있는 문자를 담고 있는 파일
바이너리 파일(binary file) : 그 이외에 컴퓨터가 인식할 수 있는 데이터를 담고 있는 파일
개행이 \n이 아님??
개행은 일반적인 문자 데이터와 성격이 조금 다르다.
개행은 줄이 바뀌었다는 일종의 현상, 그 자체가 하나의 데이터로 존재하는 대상은 아니다.
C언어에서는 개행을 \n으로 표현하도록 약속하였다.
이는 모든 컴퓨터 환경에서의 약속이 아닌 C언어만의 약속
다른 환경에서는 개행을 어떻게?
MS-DOS(Windows)의 파일 내 개행 | \r\n |
Mac(Mackintosh)의 파일 내 개행 | \r |
Unix 계열의 파일 내 개행 | \n |
따라서 Windows 기반의 편집기는 파일에 \r과 \n이 나란히 등장할 때 개행으로 인식을 하고, 매킨토시 기반의 편집기는 파일에 \r이 등장할 때 개행으로 인식을 한다.
이렇듯 개행의 표현은 운용체제마다 차이가 있기 때문에 개행 문자가 포함되는 텍스트 데이터의 저장에는 주의가 필요하다.
C언어에서 개행을 의미하는 문자 \n을 그대로 파일에 저장하고, 이 파일을 Windows나 Unix의 편집기로 열어보면 \n이 개행으로 표시되지 않음을 확인할 수 있다.
물론 Unix는 C언어와 마찬가지로 \n을 개행으로 인식하므로, Unix 계열의 편집기에서는 개행으로 확인이 된다.
그렇다면 개행의 표시방법이 C언어와 다른 운영체제에서는 개행 정보를 파일에 어떻게 저장해야 할까?
위 그림에서 보이는 바와 같이 C 프로그램의 실행과정에서 \n이 Windows 파일에 저장될 때에는 \r\n으로, 그리고 Mac의 파일에 저장될 때에는 \r로 저장되어야 해당 운영체제에서 개행으로 인식이 된다.
그런데 막상 이러한 형태의 변환을 직접 하려니 귀찮을 생각이 든다.
누군가 이러한 변환을 대신해줬면 하는 바램
스트림을 구분하는 기준2: 텍스트 모드와 바이너리 모드
파일을 텍스트 모드로 개방하면 바로 위에서 말한 형태의 변환이 자동으로 이뤄짐
예를 들면 windows를 기반으로 다음 두 가지 변환이 이뤄짐
"C 프로그램에서 \n을 파일에 저장하면 \r\n으로 변환되어 저장됨"
"파일에 저장된 \r\n을 C프로그램상에서 읽으면 \n으로 변환되어 읽혀짐"
때문에 우리가 직접 개행 문자의 변환을 신경 쓸 필요가 없다.
텍스트 모드로 파일을 개방만하면 되며, 텍스트 모드의 파일 개방을 위해서는 fopen 함수의 두 번째 인자로 다음 중 하나를 전달
rt, wt, at, r+t, w+t, a+t
반대로 바이너리 데이터를 저장하고 있는 파일의 경우에는 이러한 변환이 일어나면 안되기 떄문에 바이너리 모드로 파일을 개방해야 한다.
이 때, fopen 함수의 두 번째 인자로 다음 중 하나를 전달
rb, wb, ab, r+b, w+b, a+b
만약, t or b 둘 중 아무것도 붙이지 않는다면 default로 텍스트 모드로 파일이 개방된다.
정리하면, 바이너리 모드로 파일을 개방하면 아무런 변환도 발생하지 않는다.
그러나, 텍스트 모드로 파일을 개방하면 운영체제에 따른 표현 차로 인한 변환이 발생한다.
참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C' 카테고리의 다른 글
파일 입출력(24-4) 텍스트 데이터와 바이너리 데이터를 동시에 입출력 하기 (0) | 2020.12.17 |
---|---|
파일 입출력(24-3) 파일 입출력 함수의 기본 (0) | 2020.12.16 |
파일 입출력(24-1) 파일과 스트림(Stream), 그리고 기본적인 파일의 입출력 (0) | 2020.12.14 |
구조체와 사용자 정의 자료형2(23-5) 열거형(Enumerated Type)의 정의와 의미 (0) | 2020.12.14 |
구조체와 사용자 정의 자료형2(23-4) 공용체(Union Type)의 정의와 의미 (0) | 2020.12.13 |