У метода rd.ReadStore есть одна особенность - он не взводит у бегунка флаг конца файла rd.rider.eof. Если очередной вызов rd.ReadStore прочитал последнюю запись в файле, то следующая попытка ReadStore приведёт к трапу, даже если вы перед этим проверите конец файла:## Код:
```
PROCEDURE Read*;
      VAR rd: Stores.Reader; st: Stores.Store;
   BEGIN
      repo := NIL;
      rd.ConnectTo(f);
      IF f.Length() > 0 THEN
         rd.ReadStore(st);
         (* попытка прочитать несуществующий элемент *)
         IF ~rd.rider.eof THEN rd.ReadStore(st) END
      END;
      IF st # NIL THEN repo := st(Item) END
   END Read;
```


Контролировать конец файла можно только проверкой текущей позиции бегунка относительно размера всего файла. Вот корректный алгоритм, который не прочитает несуществующую запись:## Код:
```
PROCEDURE Read*;
      VAR rd: Stores.Reader; st: Stores.Store;
   BEGIN
      repo := NIL;
      rd.ConnectTo(f);
      IF f.Length() > 0 THEN
         rd.ReadStore(st);
         (* контроль позиции бегунка *)
         IF rd.Pos() < f.Length() THEN rd.ReadStore(st) END
      END;
      IF st # NIL THEN repo := st(Item) END
   END Read;
```
