feof()が妥当かどうかはこの際置いておくとして、
fgetc()してみないとfeof()かどうかは判らないのでfgetc()した後にもチェックは必要。
但し、普通はfgetc()の戻り値を使って判定するからわざわざfeof()を呼ぶようなコードを書く香具師は少ない。
そもそもそのサンプルの目的だけなら、これで事が足りる。
int ch; // 前提として敢えて明記
while ((ch = fgetc(f2)) != EOF) fputc(ch, f1);