안녕하세요!
두가지질문이 있는데요,
1) 71.2에서 count = fread(buffer, size, 1, fp);를 보면 count의 값이 읽은횟수인 1로 출력되는데 그러면 fread가 정수값을 출력하는건가요?
2) 그러면 70.4에서 hello.txt파일에서 fread(buffer, sizeof(buffer), 1, fp);를 하고 buffer를 출력하면 Hello, world!가 나오는데, fread가 문자열을 buffer에 복사하는 느낌으로 이해하면 되는건가요??
fread가 어떤 값을 주는지 (문자열인지 정순지) 설명해주시면 감사하겠습니다!
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까지 학습하면 됩니다.