Seek(var F; NumRec: Longlnt)




Процедура устанавливает текущую файловую переменную F на запись с номером NumRec; F — файловая переменная для типизированных и нетипизированных наборов данных. При открытии типизированного файла текущая позиция для работы с ним установлена на начало первой записи, которая по принятым соглашениям имеет номер 0, т. е. номер физической записи на единицу меньше номера логической записи. Это небольшое несоответствие в номерах может служить причиной возникновения ошибок чтения-записи, что в результате может привести к нарушению целостности важной информации. Положение усугубляется тем, что неверное позиционирование на запись с помощью процедуры Seek, как правило, не приводит к каким-либо видимым ошибкам ввода-вывода, на которые всегда можно отреагировать. Исключение составляют ситуации, когда нет доступа к файлу, файл не открыт или назначено позиционирование на несуществующую запись. Такие ситуации обрабатываются с помощью функции IOresult.

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

Для работы с файлами прямого доступа дополнительно можно использовать следующие средства:

Truncate(var F)

Процедура уничтожает все компоненты файла F, начиная с места текущего положения файлового указателя.

FilePos(var F): Longlnt

Функция возвращает для файла F текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longlnt

FileSize(var F): Longlnt

и его размер (количество записей) в виде значения типа Longlnt.

Для пустого файла вызов FileSize возвращает значение 0. Локализация ошибок при обращении к внешним носителям для обоих функций производится через IOresuIt.

Для того чтобы очередная запись могла быть записана в конец типизированного файла, необходимо перевести текущую файловую позицию в конец файла. Когда создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установленная по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)), то в конец файла ее позволяет перевести вызов Seek (F, FileSize (F));

В каждом файле число логических и физических записей совпадает, а при позиционировании номер физический записи на единицу меньше номера логической записи.

Пример. Составим программу, которая создает на диске файл, данных "телефонного справочника", обеспечивает ввод и изменение данных, поиск номера телефона по фамилии абонента.

НЕТИПИЗИРОВАННЫЕ ФАЙЛЫ

Нетипизированные файлы объявляются как файловые переменные типа FILE и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой - позволяет организовать высокоскоростной обмен данными между диском и памятью.

При инициации нетипизированного файла процедурами RESET или REWRITE можно указать длину записи нетипизированного файла в байтах. Например, так:

var

f: file;

begin

assign(f, 'myfile.dat’);

reset(f,512);

end.

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам RESET или REWRITE, в качестве которого может использоваться выражение типа WORD. Если длина записи не указана, она принимается равной 128 байтам.

Паскаль не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 65535 байтами
(емкость целого типа WORD). Однако для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт).

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением READ и WRITE, которые заменяются соответственно высокоскоростными процедурами BLOCKREAD и BLOCKWRITE. Для вызова этих процедур используются следующие предложения:

BLOCKREAD (<ф. п.>, <буф>, <[, <NN>]);

BLOCKWRITE (<ф. п. >, <буф>, <[, <NN>])

Здесь

<буф> — буфер: имя переменной, которая будет участвовать в обмене данными с дисками;

<D> — количество записей, которые должны быть прочитаны или
записаны за одно обращение к диску;

<NN> — необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей.

За одно обращение к процедурам может быть передано до

N * RECS

байт, где RECS — длина записи нетипизированного файла. Передача идет, начиная с первого байта переменной <буф>. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной <буф> была достаточной для размещения всех N * RECS байт при чтении информации с диска. Если при чтении указана переменная <буф> недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать,
указав необязательный параметр <NN> (переменная типа WORD).

После завершения процедуры указатель смещается на <NN> записей. Процедурами SEEK, FILEPOS и FILESIZE можно обеспечить доступ к любой записи нетипизированного файла.

ТЕКСТОВЫЕ ФАЙЛЫ

Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, например, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.

Текстовый файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN (End Of LiNe — конец строки), а в конце всего файла - признак EOF (End Of File — конец файла). Эти признаки можно протестировать одноименными логическими, функциями.

Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять файловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT и OUTPUT.

Процедура READ. Обеспечивает ввод символов, строк и чисел. Формат обращения:

READ (<ф.п.>, <сп. ввода>) или READ (<сп.ввода>)

Здесь <сп.ввода> — список ввода: последовательность из одной или более переменных типа CHAR, STRING, а также любого целого или вещественного типа.

Процедура READLN, Обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметра <сп.вввда>, что приведет к пропуску всех символов текущей строки вплоть до EOLN.

Процедура WRITE. Обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство. Формат обращения:

WRITE(<ф.п.>, <сп. вывода>) или WRITE (<сп. вывода>)

Здесь <сп. вывода> - список вывода: последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, a также любого целого или вещественного типа.

Файловая переменная <ф.п.>, если она указана, должна быть предварительно описана как переменная типа TEXT и связана с именем файла или логическим устройством процедурой ASSIGN. Если файловая переменная отсутствует, подразумевается вывод в стандартный файл OUTPUT, который обычно связан с экраном ПК.

Процедура WRITELN. Эта процедура полностью идентична процедуре WRITE за исключением того, что выводимая строка символов завершается кодами CR и LF. При вызове WRITELN можно опускать параметр <сп. вывода>: в этом случае в файл передаемся маркер EOLN, что при выводе на экран приведет к переводу курсора в начало следующей строки.

Логическая функция EOLN. Возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки. Формат обращения:

EOLN (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

Логическая функция SEEKEOLN. Пропускает все пробелы и знаки табуляции до маркера конца строки EOLN или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:

SEEKEOLN (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

Логическая функция SEEKEOF. Пропускает все пробелы, знаки табуляции и маркеры конца строки EOLN до маркера конца файла или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:

SEEKEOF (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

Пример. Подсчитаем общее количество символов в файле и результат разделим на 40000 — таким способом можно оценить объем рукописи в так называемых учетно-издательских листах:

var

f: text;......

s: String;

Sum: Longlnt; {Здесь будет количество символов}

begin

Write('Имя файла: '); {Запрашиваем...}

Readln(s); {и вводим имя файла}

assign (f, s);

Reset(f); {Открываем файл}

while not EOF(f) do {Подсчитываем...}

begin {количество...}

ReadLn(f,s); {символов...}

inc(Sum, Length(s)) {в файле}

end;

Close (f); {Закрываем файл}

WriteLn('Объем = ',Sum/40000:6:2,’ уч.изд.л.’)

end.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: