UNIT 70.4를 보면 fread 함수가 설명되어 있습니다.
fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);
size_t fread(void *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
성공한 읽기 횟수를 반환, 실패하면 지정된 읽기 횟수보다 작은 값을 반환
UNIT 71.2에 있는 예제는 fread 함수를 다음과 같이 사용합니다.
count =
fread(buffer, size, 1, fp); //
hello.txt에서 파일 크기만큼 값을 읽음
fread(buffer, sizeof(buffer), 1, fp);
buffer는 char* 포인터이므로 포인터 크기가 됩니다.
읽으려는 데이터가 20바이트라면 두 번째 인수에 20이 지정되어야 하는데, sizeof(buffer)는 64비트 환경에서 항상 8바이트라는 뜻이니 항상 8바이트만 읽게 됩니다. 읽으려는 데이터가 8바이트 미만일 때만 올바르게 동작하는 것처럼 보이는 코드는 될 수 있습니다.
fread 함수는 buffer가 가리키는 공간에 데이터를 채워 넣게 됩니다.
fread는 성공한 읽기 횟수를 반환합니다. 예제에서는 파일의 크기가 작으니 한 번에 읽는 방법을 선택하지만, 1기가 단위의 파일이라면 1기가 단위만큼 메모리를 할당해서 읽을 수 없기 때문에 4k 단위로 메모리를 할당하고 4k 단위로 읽어들이는 과정을 거치게 됩니다.
fread 함수로 파일을 부분적으로 읽는 부분은 UNIT 71.7을 학습하면 됩니다.
fread 함수의 반환값은 읽기를 한 횟수이니 정수입니다.
fread로 읽은 데이터는 정수나 문자열이 아니라 단순히 바이트 데이터이고, 그 데이터를 정수로 처리할지, 문자로 처리할지, 바이너리로 처리할지는 프로그래머의 선택입니다. UNIT 82까지 학습하면 자연히 알게 될 겁니다.
data.dat 파일이 있는 데, 처음 4바이트는 정수로 처리하고, 그 다음 20바이트는 이름으로 처리하고... 이렇게 개발자만 아는 방식으로 정의할 수 없으니 struct data처럼 자료 구조로 정의해서 파일로 저장하고, 저장된 파일을 메모리로 읽어오게 됩니다. UNIT 82까지 학습하면 됩니다.