C언어에서는 텍스트파일과 바이너리 파일은 구분해서 사용된다.
잘못 읽어 들이는 것을 방지하기 위함이다.
먼저 텍스트 파일은 문자로 구성된 파일이며, 대부분 ASCII(아스키코드)문자로 이뤄진 파일이나 사람이 사용하는 한글, 영문 같은 문장들로 이뤄진 파일이다.
텍스트 파일은 연속적인 라인들로 구성되어 있으며
그 예로 확장자가 cpp인 프로그램 소스코드 파일이나 메모장에서 작성한 txt 파일 등이 있을 것이다.
이러한 텍스트파일과 달리, 이진파일은 데이터로 구성된 파일이다.
사람이 읽을 수는 없지만 컴퓨터는 읽을 수 있는 파일이다.
모든 파일은 0과 1로 이루어져 있으며 바이너리 파일이라고도 부른다.
텍스트파일은 라인들로 분리되는데 이진파일은 라인들로 분리되지 않는다.
그리고 모든 데이터들은 문자열로 변환되지 않고 입출력 된다(이진수 형태로 그대로 저장된다).
예로 이미지 파일, 사운드 파일, 실행 파일 등이 있다.
프로그램에서 파일을 연 다음에는 데이터를 읽거나 쓸 수 있고 마지막엔 파일을 닫아야 한다.
먼저 파일을 열 때에는 fopen()함수를 쓰는데 파일이름을 가지고 파일을 생성해서 FILE포인터를 반환한다.
FILE은 stdio.h에 typedef를 이용해서 선언된 구조체 자료형인데 fopen()의 첫번째 파라미터에는 파일이름을 나타내는 문자열이 들어가고 이는 배열에 담겨서 전달될 수도 있다.
두번째 파라미터는 파일을 어떤 모드로 열 건지를 의미한다.
모드 | 설명 | |
일반모드 | “r” | 읽기모드 |
“w” | 쓰기모드 | |
“a” | 추가모드 | |
수정모드 | “r+” | 쓰기모드로 전환할 수 있는 읽기모드 |
“w+” | 읽기모드로 전환할 수 있는 쓰기모드 | |
“a+” | 읽기모드로 전환할 수 있는 추가모드 | |
텍스트파일, 이진파일 | “t” | 텍스트파일모드 |
“b” | 이진 파일 모드 |
파일을 닫을 땐 fclose() 함수를 쓴다.
파일을 문제없이 잘 닫으면 0이 리턴되고, 실패했다면 -1을 리턴한다.
텍스트 파일을 읽고 쓰기 위한 라이브러리 함수들은 다음과 같다.
종류 | 입력 함수 | 출력 함수 |
문자단위 | Int fgetc(FILE *fp) | Int fputc(intc, FILE *fp) |
문자열단위 | Char *fgets(char *buf, int n, FILE *fp) | Int fputs(const char *buf, FILE *fp) |
서식화된 입출력 | Int fscanf(FILE *fp, …) | Int fprintf(FILE *fp, …) |
이진데이터 | Size_t fread(char *buffer, int size, int count, FILE *fp) | Size_t fwrite(char *buffer, int size, int count, FILE *fp) |
이진파일을 관련 파일 모드에는 b를 붙이고 텍스트파일 파일 모드에는 t를 붙여주면 된다.
예를 들어 fopen(“binary.bin”,”wb”) 같은 형식이다. (보통 이진 파일은 확장자가 .bin 이다.)
이진 파일 출력은 메모리 블록에 있는 데이터를 디스크의 파일에 직접 저장한다.
예를 들어 fwrite(buffer, sizeof(int), SIZE, fp) 의 형식인데 buffer는 메모리 블록의 시작주소, sizeof(int)는 항목의 크기, SIZE는 데이터 항목의 개수, fp는 file 포인터이다.
또한 이진파일을 읽으려면 fread(buffer, sizeof(int), SIZE, fp); 와 같은 함수를 사용한다.
파일에 저장된 데이터를 원하는 위치로 건너뛰거나, 읽은 위치로 돌아가서 다시 데이터를 읽을 수도 있다.
이땐 fseek(파일포인터, 이동거리, 기준위치); 함수를 쓴다.
또한 이동한 위치를 값으로 확인할 수도 있는데 ftell() 함수를 쓴다.
현재 열려있는 파일내에서 데이터를 읽거나 저장하고싶은 위치 = ftell(파일포인터); 의 형태로 사용하면 된다.
ref: https://rumiamochi.tistory.com/28, https://euncero.tistory.com/19