Добавлю свои 2 коп.
ИМХО  " r.eof устанавливалось в TRUE только после попытки чтения."  - это потому, что  флаг (eof) должен выражать успешность/не успешность операции чтения  по причине исчерпания доступных данных (в общем случае), а не отражать взаиморасположение текущей позиции для чтения и границы данных, которая (в общем случае) может динамично изменяться.

PS.
Сразу не прошёлся по ссылке из замечания И.Ермакова.  Конечно типичный "полный проход".