Read(StatsFile. StatsRecord);

Как и в случае Write, Read может считать несколько записей в одном вызове. Если вы попытаетесь произвести считываение посредством Read за пределами конца файла, то получите ошибку времени выполнения.

Указатель файла и номера записей

Удобно думать о файле, имеющем невидимый указатель, который указывает на запись, которая должна обрабатываться следующей операцией Read или Write. Когда бы не был открыт файл, посредством ли Reset, или Rewrite, этот невидимый указатель располагается в начале файла. Каждая операция Read или Write перемещает указатель файла на одну запись таким образом, что он указывает на следующую запись, за той, которая была обработана.

Если вы применяете Read или Write к нескольким записям, указатель файла преме-щается вперёд один раз для каждой записи, которая считывалась или записывалась. Таким образом, если ваш код считывает две записи, как следующий:

Read(StatsFile, StatsRecordl, StatsRecord2);

указатель файла будет помещен на запись, следующую за той, что считывается в переменную StatsRecord2

Записи в файле записей нумеруются последовательно, начиная с 0. Таким образом, первой записью в файле является запись 0, а последней записью в файле из 12 записей была бы запись номер 11. Если вы хотите выяснить, сколько записей имеется в файле, вызовите стандартную функцию FileSize. Я подробно расссмотрю FileSize в следующем разделе.

Перемещение и проверка указателя файла

Механизмом, позволяющим произвольный доступ к записям, является способность перемещать и проверять положение указателя. Эти возможности реализованы в процедуре Seek и функции FilePos. Seek перемещает указатель файла к специфицированной записи файла, a FilePos сообщает вам, на какую запись указывает указатель в настоящий момент. Таким образом, чтобы найти и считать пятую запись из файла записей, вы должны были бы написать:

Seek(StatsFile, 4); {поиск 5-й записи, считая с 0}

Read(StatsFile, StatsRecord); { и считывание записи }

Аналогично, если вы хотите насать в пятую запись файла новую информацию, вы отыскиваете эту позицию и делаете запись при помощи Write

И вот здесь вы должны быть внимательны. Если вы хотите считать запись, изменить ее, а затем записать новую информацию поверх старой, вы должны снова выполнить Seek для записи предшествующей записываемой. Например, следующий код считывает, изменяет и обновляет запись в файле:

Seek(StatsFile, 4); ( поиск 5-й записи }

Read (StatsFile, StatsRecord) ,- { считывание записи }

StatsRecord.NumberOfSignals := 100;

Seek(StatsFile,4);{перемещение укает, ф-ла обратно к 5-й san.} Write(StatsFile, StatsRecord); { и обновление записи }

Если вы забудете об этом втором Seek, то вы закончите презаписью шестой записи дополняющей информацией. Это является очень распространенной ошибкой, случающейся как с начинающими, так и с опытными программистами.

Если вы хотите добавить запись в конец существующего файла, вы должны выполнить Seek для поиска позиции на одну запись превышающую текущее положение конца файла, прежде, чем начнете записывать. Простейшим способом сделать это является использовать FlleSize для получения числа записей в файле и использовать это число в качестве параметра для Seek, как в следующем:


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в среде Delphi



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31