fread, fwrite -
バイナリストリームの入出力
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
fread() 関数は
stream
ポインターで指定されたストリームから
nmemb
個のデータを読み込み、
ptr
で与えられた場所に格納する。
個々のデータは
size
バイトの長さを持つ。
fwrite() 関数は
ptr
で指定された場所から得た
nmemb 個のデータを、
stream
ポインターで指定されたストリームに書き込む。
個々のデータは
size
バイトの長さを持つ。
これらの処理を停止せずに行いたいときは、
unlocked_stdio(3)
を参照のこと。
成功すると、
fread() と
fwrite()
は読み書きを行った要素の個数を返す。
size が 1
の場合は、この数字は転送されたバイト数と等しい。
エラーが生じた場合や、ファイルの末尾
(end-of-file) に達した場合、
返り値は指定した個数よりも小さい値
(または 0) となる。
The file position indicator for the stream is advanced by the number of bytes
successfully read or written.
fread() は end-of-file
とエラーを区別しないので、
どちらが生じたかを判断するためには、
呼び出し側で
feof(3) と
ferror(3)
とを使用しなければならない。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
fread(), fwrite() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C89.
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 = fopen("/bin/sh", "rb");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
unsigned char buffer[4];
size_t ret = fread(buffer, ARRAY_SIZE(buffer), sizeof(*buffer), fp);
if (ret != sizeof(*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);
}
read(2),
write(2),
feof(3),
ferror(3),
unlocked_stdio(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。