fread, fwrite - 이진(바이너리) 스트림 입력/출력
#include <stdio.h>
size_t fread(void ptr[restrict .size * .nmemb],
size_t size, size_t nmemb,
FILE *restrict stream);
size_t fwrite(const void ptr[restrict .size * .nmemb],
size_t size, size_t nmemb,
FILE *restrict stream); 함수 fread() 는 stream이 가리키는 스트림에서 각 size 바이트 만큼 긴 데이터의 nmemb 요소를 읽어, ptr이 가리키는 위치에 읽은 데이터들을 저장한다.
함수 fwrite() 는 ptr이 가리키는 위치에 있는 데이터들을 얻어서 각 size 바이트 만큼 긴 데이터의 nmemb 요소를 stream이 가리키는 위치의 스트림에 쓴다.
For nonlocking counterparts, see unlocked_stdio(3)EN.
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).
The file position indicator for the stream is advanced by the number of bytes successfully read or written.
fread() 는 EOF와 에러를 구분하지 않는다. 그리고 호출자는 무엇이 일어났는지를 결정 하기 위해 feof(3)EN 와 ferror(3)EN 를 사용해야 한다.
이 섹션에서 사용되는 용어에 대한 설명은 attributes(7)EN을 참조하십시오.
| 상호 작용 | 속성 | 번호 |
| fread(), fwrite() | Thread safety | MT-Safe |
POSIX.1-2001, POSIX.1-2008, C99.
The program below demonstrates the use of fread() by parsing /bin/sh ELF executable in binary mode and printing its magic and class:
$ ./a.out
ELF magic: 0x7f454c46
Class: 0x02
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int
main(void)
{
FILE *fp;
size_t ret;
unsigned char buffer[4];
fp = fopen("/bin/sh", "rb");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
ret = fread(buffer, sizeof(*buffer), ARRAY_SIZE(buffer), fp);
if (ret != ARRAY_SIZE(buffer)) {
fprintf(stderr, "fread() failed: %zu\n", ret);
exit(EXIT_FAILURE);
}
printf("ELF magic: %#04x%02x%02x%02x\n", buffer[0], buffer[1],
buffer[2], buffer[3]);
ret = fread(buffer, 1, 1, fp);
if (ret != 1) {
fprintf(stderr, "fread() failed: %zu\n", ret);
exit(EXIT_FAILURE);
}
printf("Class: %#04x\n", buffer[0]);
fclose(fp);
exit(EXIT_SUCCESS);
}