이진 파일은 이름에서 알 수 있으시다시피 이진(0과 1)으로만 구성된 파일입니다. 따라서 파일에 어떤 값이 있는지는 개발자가 의도하기에 달려 있습니다. 의도한 특정 규칙에 따라 파일을 읽고 메모리에 저장시키는 것이 읽기 작업의 중심 화제인 것이죠.
위와 같이 4bytes 크기의 이진 파일을 읽을 때도 프로그램 내에서 어떤 방식으로 데이터를 읽어낼 것인지에 따라 데이터의 개수와 값이 달라질 수 있습니다. int형은 64bit 운영체제에서 4bytes를 소모하므로 그대로 받아오지만 short형은 2bytes를 소모하므로 값이 두개로 분리되어 각각 따로 해석되고 있습니다.
위는 C언어에서 이진파일을 읽어들이는 fread 함수의 선언입니다. 각 매개변수의 의미는 다음과 같습니다.
void *buffer : 데이터를 저장할 저장공간의 주소
size_t size : 각 항목이 차지하는 바이트값
size_t count : 항목의 개수
FILE *stream : FILE 구조체의 포인터 (스트림)
이 fread 함수를 이용하고자 하시면 앞서 1편에서 말씀드렸듯 모든 컴퓨터 파일이 이진 파일이기 때문에 아무 파일이나 읽도록 하시면 되겠습니다. 저는 .c 파일 하나를 읽어보도록 하겠습니다.
// fread를 사용하여 읽는 코드
#include <stdio.h>
int main(void)
{
char data[31];
FILE *fp = fopen("binFileRead.c", "rb");
fread(data, sizeof(char), 30, fp);
data[30] = '\0';
printf("%s", data);
}
fopen 함수로 FILE 포인터를 받아낸 뒤 이를 char형 데이터(1byte) 배열에 넣는 코드입니다. 이때 count 매개변수의 인자로 30이 주어졌기 때문에 실제로 파일로부터 받아오는 byte는 (1byte X 30)을 하여 30bytes입니다. 이후 printf 함수에서 %s 키워드를 사용하기 위해 끝에 null 값(\0)을 넣어준 것을 보실 수 있습니다. 출력은 다음과 같습니다.
출력을 보시면 #include부터 받아내다가 받아내는 count 수가 작아 중간에 #define에서 짤린 모습을 보실 수 있습니다. 이와 같이 .c 파일에 적어두었던 내용들이 출력되는 것을 확인해보았습니다.
fread 함수의 반환값
fread 함수의 반환값은 size_t 형으로 함수가 읽어들인 모든 항목의 개수를 출력합니다. 의도한대로 잘 읽어들였을 경우 count의 값을 그대로 출력하지만 오류가 발생하거나 파일의 길이가 count보다 짧을 경우 count보다 작은 값이 반환될 수 있습니다. 만약 size 또는 count 변수 중 하나라도 0이라면 0을 반환하고 버퍼를 건드리지 않고 종료됩니다.
size_t형이란 해당 시스템의 최대 크기의 데이터 값을 표현하는 것으로 32bit 운영체제에서는 32bit(4bytes), 64bit 운영체제에서는 64bit(8bytes)의 값을 의미합니다. 즉 프로그램 실행시 운영체제가 처리할 수 있도록 바이트 수를 제한한 것이라고 보시면 되겠습니다.