fread での失敗2006年08月16日 09時59分44秒

FreeBSD 上の man fread は

#include 

size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);

と出てくる。

size は構造体の大きさ。nmemb はその構造体の数。最大で読み出せるバイト数は、これらを掛け合わせたものになる。ただ単にバイト列を読めるだけ読みたいのなら、size は 1 でもいい。


char buffer[512];

fread(buffer, 1, sizeof(buffer), fd);

といった感じだ。buffer が char から変えたときの為に、sizeof を使った方が変更には柔軟に対応できる。

fread(buffer, sizeof(buffer[0]), sizeof(buffer), fd);

なぜか、この関数に渡す引数はよく間違える。


char buffer[512];

fread(buffer, 1, sizeof(buffer), fd);

size と nmemb を入れ間違えたのだ。つまり、buffer の大きさの物を一つだけ、読み込めと命令しているわけだ。

文字列を読めるだけ読み込むつもりだったが、512 バイトが読める時にのみ読み込む事になる。もし、100 バイトしかないと、失敗する事になる。

気が付くのに時間がかかってしまった…