fread, fwrite 함수
Programming/C 2013. 2. 15. 03:38 |바이너리 데이터의 입출력 : fread, fwrite
이 함수들은 바이너리 데이터의 입출력에 사용이 된다.
fread
#include <stdio.h>
size_t fread((void*) buffer, size_t size, size_t count, FILE* stream);
성공 시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환.
ex) int buf[12];
ex) fread((void*)buf, sizeof(int), 12, fp);
fread 함수는 두 번째 전달인자와 세 번째 전달인자의 곱의 바이트 크기만큼 데이터를 읽어 들이는 함수이다.
따라서 위의 문장은 "int형 데이터 12개를 fp로부터 읽어 들여서 배열 buf에 저장하라" 라는 뜻이 된다.
이 함수는 실제로 읽어 들인 개수를 반환하는데(바이트 수가 아니라 개수이다.) 위 문장은 sizeof(int) 크기의 데이터를 12개 읽어 들이는 경우이니, 함수의 호출이 성공을 하면 12가 반환된다. 그리고 만약에 12보다 작은 값이 반환된다면 파일의 끝에 도달을 해서 12개를 채우지 못했거나, 오류가 발생한 상황으로 인식할 수 있다.
fwrite
#include <stdio.h>
size_t fwrite((void*) buffer, size_t size, size_t count, FILE* stream);
성공 시 전달인자 count, 실패 시 count보다 작은 값 반환.
ex) int buf[7] = {1, 2, 3, 4, 5, 6, 7};
ex) fwrite((void*)buf, sizeof(int), 7, fp);
"sizeof(int) 크기의 데이터 7개를 buf로부터 읽어서 fp에 저장하라" 라는 뜻이 된다.
※ 바이너리 데이터를 읽을 때에는 일반적으로 char형 배열을 사용한다. char는 모든 시스템에서 1바이트로 처리되므로 크기를 지정하기가 수월하기 때문이다.
20행 : if문은 fread 함수가 BUF_SIZE보다 작은 값을 반환했을 때 참이 된다. 그런데 fread 함수가 BUF_SIZE를 반환하지 않았다는 것은 오류가 발생했거나, 파일의 끝에 도달했다는 의미가 되므로 feof 함수를 이용해서 이를 확인해야 한다.
24행 : 파일의 끝에 도달해서 BUF_SIZE보다 적은 수의 바이트를 읽었을 때 실행이 된다. 비록 적은 바이트를 읽었다 할지라도 이 데이터 역시 파일의 일부분이므로 fwrite 함수를 이용해서 복사를 해줘야 한다. 따라서 24행에서 fwrite 함수의 호출을 통해 읽어 들인 마지막 데이터를 출력하고 있다.
--------------------------------------------------------------------------------------------
※ 구조체 변수의 데이터를 통째로 바이너리 형태로 저장할 수 있는 이유는, 구조체 변수의 데이터를 통째로 바이너리 형태로 읽어 들이기 때문이다.
'Programming > C' 카테고리의 다른 글
fsetpos, fgetpos 함수 (0) | 2013.02.15 |
---|---|
ftell함수를 이용한 파일 사이즈 알아내는 프로그램. (0) | 2013.02.15 |
조건부 컴파일(Conditional Compilation) (0) | 2013.02.15 |
#error, #pragma 및 #line (0) | 2013.02.15 |
매크로와 전처리기 (Preprocessor). (0) | 2013.02.15 |