テキストファイルを一行ずつbufに読んで出力する処理なんだけど、

while (!fgets(buf, sizeof(buf), fp))
printf(buf);
だと問題ないけど、

while (!feof(fp)) {
fgets(buf, sizeof(buf), fp);
printf(buf);
}

だと、最後の行が二度表示されるんだ。どうしてなんだ?