c23 [C++] 파일 입출력
본문 바로가기
[C++]

[C++] 파일 입출력

by Jarvis2304 2022. 12. 10.

▶ 파일

- 저장 매체에 저장되는 정보

- 바이트나 블록단위로 입출력됨

- 기록되는 데이터의 종류에 따라 텍스트 파일(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++ 표준 위원회에서는 개발자들을 위해 파일 입출력 라이브러리에 대한 표준을 별도로 정함

 

표준 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 파일을 읽고 단어 검색

 

 

참고문헌

ASCII Code(아스키 코드) : 네이버 블로그 (naver.com)

'[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

댓글