이번 시간에는 c언어 fread 함수를 먼저 알아보도록 하겠습니다.

 

 사용법이 다소 복잡해 보입니다. ptr은 파일에서 읽어온 것을 저장할 block을 가리키는 포인터입니다. 다음에, size는 block의 사이즈, count는 갯수를 의미합니다.

 

 

 만약에, size개의 크기를 count개만큼 읽어오겠다고 한다면, 읽어온 총 byte 수는 size에 count를 곱한 값입니다. 파일 지시자가 가리키는 위치로부터 size에 count를 곱한 byte만큼 주루룩 읽어오는 함수가 fread인 셈입니다.

 

 


 먼저 1.txt에 다음과 같은 내용을 저장하였습니다.

 

 

 fw 프로그램은, fwrite 함수를 이용해서 moo형 레코드를 하나 하나씩 1.txt라는 파일에 썼습니다.

 

 

 1.txt에는 다음과 같은 내용이 저장이 되어 있는데요. 이것을 fread 함수로 읽어보겠습니다.

 

 

 먼저 moo형은 위와 같습니다. name과 score로 이루어져 있는 평범한 record입니다. 그리고 저는 fw 프로그램에서도, moo 레코드단위로 fwrite 함수를 이용해서 파일에 썼습니다.

 

 

 저는 fwrite 함수로 moo 레코드를 쓴 1.txt를 읽어내려고 합니다. 그러면 어떻게 하면 될까요? 일단 읽어낸 것을 저장할 버퍼의 역할은 moo형으로 선언한 I가 해야 합니다. I의 주솟값을 넘겨줍니다. 2번째 인자로는 몇 byte만큼을 읽어서 버퍼에 넣을 건지를 알려줘야 하는데요. 당연하게도 sizeof(moo) byte만큼 읽어들이면 됩니다.

 

 몇 개를 읽을 거냐가 3번째 인자인데요. 저는 1을 많이 넣습니다. 4번째 인자는 파일 포인터입니다. 이렇게 넣어주면 제대로 읽어올 수 있습니다.

 

 

 제대로 읽어오는군요. 보통 단위 레코드는 하나씩 읽어내긴 합니다. 그러니 3번째 인자는 1을 보통 넣으실 겁니다. 하나 주목해야 할 것은, 링크에 나온 아래 문구입니다.

 

 

 파일 지시자는, read를 한 byte 총 수만큼 이동한다. 예를 들어서 ara 123이라는 sizeof(moo) byte만큼을 읽었다면, 파일 지시자는 ara 123을 가리키는 게 아닌, brb 234를 가리킵니다. 

 


 3번째 인자에 1보다 큰 수를 넣어보겠습니다.

 

 moo를 3개 넣을 수 있는 배열을 선언했습니다. 그리고 이 배열의 시작 주소에 moo byte 만큼을 파일에서 2번 읽어옵니다.

 

 

 그러면, ara 123과 brb 234가 들어갑니다. 이는, 2sizeof(moo) 바이트 만큼을 한꺼번에 읽어버렸기 때문입니다. 그리고 I는 연속적으로 메모리에 할당이 되어 있기 때문에 I[0]과 I[1]을 읽으면 ara의 내용과 brb의 내용이 차례대로 출력이 될 수 밖에 없습니다.

 

 

 이 경우에는 어떨까요? 4개의 record를 읽어들어야 하는 상황인데, 파일에는 3개밖에 없어요. 즉, 해당 크기만큼 다 읽기도 전에 EOF에 도달합니다. 혹은 읽다가 error가 난 경우에는 어떨까요? 그러한 경우에는 특수한 상태 flag가 setting이 됩니다. feof, ferror입니다. 읽다가 EOF가 난다면, feof가 setting이 됩니다.

 

 일단 이 정도만 정리하고 가시면 좋을 듯 싶습니다.