fread での失敗 ― 2006年08月16日 09時59分44秒
#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 バイトしかないと、失敗する事になる。
気が付くのに時間がかかってしまった…
最近のコメント