arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
fread()
fread()

この関数の目的

fread()は、ストリームからデータを直接読み込む。 fwrite() も参照のこと。

定義

	#include <stdio.h>
	size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

働き

この関数は ptr が指す配列に nmemb 個の size の大きさの要素を stream が指すストリームから読み込む。 ストリームのファイル位置指定子が定義されていれば、読み込んだ文字数だけ進められる。 エラー発生時のファイル位置指定子の値は不定になる。要素の部分だけを読んだとき、その値は不定になる。

返り値は成功裡に読み込まれた要素の数であり、読み込みエラーが発生するかファイルの終わりに到達したときは nmemb よりも少なくなるかもしれない。 sizenmemb が0である場合、返り値は0となり、配列やストリームの状態は変化しない。

解説

常識的に考えるとバグの元になるのだが、返り値は読み込まれたバイト数ではなく、要素数である。 size に 1 を渡せばバイト数と同じことになる。

fread() 、 fwrite() を使うときに知っておくべきは、fwrite() が出力するのはメモリ上のオブジェクトそのままであり、 出力されたファイルを他のコンピュータ上に持っていっても fread() で復元されない可能性があるということである。 これは CPU の違いに起因するものである。多くのコンピュータで互換性のあるバイナリファイルを作りたかったら、データの表現方法を決めて、 それに変換してから1バイトずつ出力するのが最も安全な方法である。

arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC