▶ 파일
- 저장 매체에 저장되는 정보
- 바이트나 블록단위로 입출력됨
- 기록되는 데이터의 종류에 따라 텍스트 파일(text file) 과 바이너리 파일(binary file)로 나뉨
▶ 텍스트 파일 (text file)
- 사람들이 사용하는 글자 혹은 문자로만 구성되는 문서파일
- 오직 글자로만 이루어진 문서파일
- 사람들이 사용하는 글자에는 한글, 영어 알파벳, 숫자, # % @ ? 등의 기호가 존재하며, 각 글자마다 고유의 바이너리 코드(이진 코드)가 주어짐
- 컴퓨터 등장 초기, 영어 문자에 대한 코드 쳬계는 ASCII 코드로 만들어짐
- 그 후 전 세계 언어의 각 글자에 2바이트 바이너리 코드를 부여하여 유니코드(Unicode)라는 표준화된 문자 코드 체계 만듦
텍스트 파일 ex) text 파일, HTML 파일, C++ 소스 파일, C소스 파일, XML 파일 등
▷ 아스키코드 표
▷ 텍스트 파일 내부
- 텍스트 파일에는 문자로 해석 가능한 코드 값들만 존재
- 각 문자의 아스키 코드가 elvis.txt 파일에 기록
● 파일의 첫 바이트는 0x57로서 문자 'w'에 해당하는 아스키 코드
● 파일의 마지막 부분의 1961에서 '1'은 문자로서 0x31로 저장, '1'도 문자이기 때문에 0x01로 저장되지 않음, 텍스트 파일은 문자들만 다루는 파일이기 때문
- 텍스트 파일에는 문자 코드가 아닌 어떤 값도 존재할 수 없음, 만약 존재한다면 그 파일은 바이너리 파일임
▷ 텍스트 파일의 <Enter> 키
메모장과 같은 텍스트 편집기들은 사용자가 입력한 <Enter> 키를 '\r' 과 '\n'의 두 아스키 코드로 저장함
● '\r' 은 carriage return 제어 코드로서, 커서의 현재 줄을 맨 앞으로 옮기도록 하는 지시
● '\n' 은 line feed 제어 코드로서, 커서를 현재 위치에서 한 줄 밑으로 옮기도록 하는 지시
▶ 바이너리 파일 (binary file)
- 문자로 표현되는 않는 바이너리 데이터(이미지, 오디오, 그래픽, 컴파일된 코드)가 기록한 파일
● 텍스트 파일의 각 바이트 → 문자로 해석
● 바이너리 파일의 각 바이트 → 문자로 해석되지 않는 것도 있음 (각 바이트의 의미는 파일을 만든 응용프로그램만이 해석가능)
바이너리 파일 ex)
- jpeg, bmp 등의 이미지 파일
- mp3 등의 오디오 파일
- hwp, doc, ppt 등의 확장자를 가진 멀티미디어 문서 파일
- obj, exe 등의 확장자를 가진 컴파일된 코드나 실행 파일
▷ 바이너리 파일 내부
- 문자로 해석할 수 없는 바이너리 값들이 존재
▶ C++ 파일 입출력 라이브러리
- ANSI / ISO C++ 표준 위원회에서는 개발자들을 위해 파일 입출력 라이브러리에 대한 표준을 별도로 정함
● ifstream :파일 읽기 시 사용
● ofstream :파일 쓰기 시 사용
● fstream :하나의 파일에 읽기와 쓰기를 동시에 할 때 사용
▷ 파일 입출력 스트림은 파일을 프로그램과 연결
- ifstream이나 ofstream은 파일을 프로그램과 연결하는 스트림으로서, 프로그램은 ifstream 객체를 통해서 파일을 읽고 ofstream 객체를 통해 파일 쓰기를 진행
● >> 연산자와 istream의 get(), read() 함수
- 연결된 장치로부터 읽는 함수
- 키보드에 연결되면 키 입력을, 파일에 연결되면 파일에서 입력
● << 연산자와 ostream에 put(), write() 함수
- 연결된 장치에 쓰는 함수
- 스크린에 연결되면 화면에, 파일에 연결되면 파일에 출력
▷ 헤더 파일과 namespace
- c++ 파일 입출력 라이브러리를 사용하기 위해 <fstream> 헤더 파일과 std 이름공간의 선언 필요
▷ 파일 입출력모드 :텍스트 I/O와 바이너리 I/O
- C++ 파일 입출력 시스템은 텍스트 I/O와 I/O로 구분
- C++ 파일 입출력 클래스는 두 방식 지원
● 텍스트 I/O
- 문자 단위로 파일에 쓰기, 파일에서 읽기
- 문자들만 기록하고, 읽은 바이트를 문자로 해석
- 텍스트 파일에만 적용
● 바이너리 I/O
- 바이트 단위로 파일에 쓰기, 파일에서 읽기
- 데이터를 문자로 해석하지 않고 있는 그대로 기록하거나 읽음
- 텍스트 파일과 바이너리 파일 모두 입출력 가능
● 텍스트 I/O와 바이너리 바이너리 I/O 입출력 시 차이점
- 개행 문자(\n)를 다루는데에 있음 (뒤에서 설명)
예제) << 연산자를 이용한 간단한 파일 출력
예제) 키보드로 입력받아 텍스트 파일 저장하기
예제) ifstream과 >> 연산자로 텍스트 파일 읽기
▶ 파일 모드 (file mode)
- 파일 입출력에 대한 구체적인 작업 형태에 대한 지정
ex)
- 파일에서 읽을 작업을 할 것인지, 쓰기 작업을 할 것인지
- 기존 파일의 데이터를 모두 지우고 쓸 것인지, 파일의 끝 부분에 쓸 것인지
- 텍스트 I/O 방식인지 바이너리 I/O 방식인지
▷ 파일 모드 지정 - 파일 열 때
- 파일 모드는 파일을 열 때 지정하며, open() 함수나 ifstream, ofstream, fstream 의 생성자를 통해 지정함
● open("파일 이름", 파일모드)
● ifstream ("파일 이름", 파일모드)
● ofstream ("파일 이름", 파일모드)
- 파일 포인터는 파일 내에 읽거나 쓸 위치를 가리키는 특별한 마크
● student.text 파일에서 처음부터 읽고자 하는 경우
● student.txt 파일의 끝에 데이터를 저장하는 경우
● 바이너리 I/O로 data.bin 파일을 기록하는 경우
예제) get()을 이용한 텍스트 파일 읽기
▶ get()과 EOF
- get() 은 한 바이트를 읽고 파일 포인터를 다음 바이트 위치로 전진시킴
- get()이 파일의 마지막 문자를 읽고 나면, 파일 포인터는 전진하여 파일의 끝을 가리킴
- 그러나 파일 끝에 도달하였는지는 아직 알 수 없기 때문에, 이때 eof() 함수를 호출하면 false(파일 끝에 도달하지 않았음)를 리턴
- 만일 get()을 한번 더 실행하면, 이때 비로서 get()은 더 읽을 수 없는 파일 끝임을 알게 되어 EOF(-1)을 리턴하고, 스트림 내부에 eofbit 플래그를 1(true)로 설정, 이제 eof() 함수를 호출하면 true를 리턴
▷ get()으로 파일의 끝을 인지하는 방법
▷ 파일의 끝을 잘못 인지하는 코드
예제) 텍스트 파일 연결
▶ 텍스트 파일의 라인 단위 읽기
- 두가지 방법 존재
● istream의 getline(char*line, int n) 함수 이용
● getline(ifstream& fin, string&line) 함수 이용
예제) istream의 getline()을 이용하여 텍스트 파일을 읽고 화면 출력
예제) getline(ifstream&, string&)으로 words.txt 파일을 읽고 단어 검색
참고문헌
'[C++]' 카테고리의 다른 글
[C++] 예외처리 (0) | 2022.12.10 |
---|---|
[C++] STL (표준 템플릿 라이브러리) (0) | 2022.11.30 |
[C++] 템플릿 (0) | 2022.11.23 |
[C++] 가상함수와 추상 클래스 (다형성) (0) | 2022.11.17 |
[C++] 상속 (0) | 2022.11.08 |
댓글