feof

feofは、指定されたファイルポインタ(ストリーム)がEOFかどうかを判定する。

Man page of FERROR
C言語関数辞典 - feof

fgetcの場合はEOFを返すので戻り値で判定できるが、fgetsやfreadなど他の関数の場合は読み込めなかった理由を戻り値だけで判定できない。
読み込めない理由は、EOFの場合もあるが、エラーの場合もあるからである。

今回は、freadの読み込みで、feofによるEOF判定を行う。

test.txtをバイナリ読み込みで開いて、3バイトずつ読み込んでいく。
3バイトより小さい時は、EOFかもしれないし、エラーかもしれない。
ひとまずEOFかどうかをfeofでチェックして、ループを抜ける。
あと、エラーが発生しているかどうかを、perrorを出力することで見れるようになっている。

$ ls
feof  feof.c  test.txt
$ cat test.txt
ABCDE
FGHIJ
KLMNO$ vi feof.c
$ gcc feof.c -o feof
$ ./feof
buf = [ABC], read_len = 3
fread: Success
buf = [DE
], read_len = 3
fread: Success
buf = [FGH], read_len = 3
fread: Success
buf = [IJ
], read_len = 3
fread: Success
buf = [KLM], read_len = 3
fread: Success
buf = [NO], read_len = 2
fread: Success
feof(fp): true
$

改行とかも入っているので、読み込んだ3バイト文字列の前後に'['と']'を挟んでおいた。
このように、ファイル終端まで来ると、read_lenは3より小さくなる。
このとき、perrorはSuccessを出力しているが、feofが真なので、EOFであることがわかる。

Sample/c/feof/feof/src/feof at master · bg1bgst333/Sample · GitHub