При работе с типизированными файлами)
Переместить указатель (позиционировать) на запись с определённым номером можно с помощью специальной процедуры:
Seek(имя_файловой_переменной, номер_позиции);
где номер_позиции – константа, переменная или выражение целого типа, содержащее номер позиции, которую необходимо сделать текущей. Номер позиции должен находиться в допустимых пределах (от 0 до n-1, если файл содержит n записей).
Например:
Seek(FI, 0); {Установка указателя файла на нулевую запись файла FI}
Seek(FR, 10); {Установка указателя файла на последнюю запись в файле, состоящем из 10 записей}
Таким образом, процедура Seek, позволяя сделать текущей любую запись, реализует прямой метод доступа в типизированных файлах.
С процедурой Seek связана и процедура Truncate, позволяющая удалить из файла все записи, начиная с текущей и заканчивая последней, т.е. Truncate позволяет «отсечь конец» открытого файла
Truncate(имя_файловой_переменной);
Например, для того чтобы из файла удалить все записи, начиная с пятой, необходимо сделать текущей шестую запись (она имеет номер 5), а затем обратиться к процедуре Truncate:
{Установка указателя на 6-ю позицию}
Seek(FI, 5);
Truncate(FI); {Удаление всех записей, начиная с текущей}
Целочисленная функция FileSize(имя_файловой_переменной) возвращает число, равное реальному количеству записей в файле (оно на единицу больше номера последней записи).
Например:
WriteLn('Файл содержит ', FileSize(FI):4, ' записей.');
При добавлении новой записи в конец файла необходимо установить указатель за последний компонент (на маркер «конец файла») следующим образом:
Seek(FI, FileSize(FI));
Вызов процедуры Seek(FI, FileSize(FI)-1); позволяет осуществить доступ к последней записи файла.
Функция целого типа FilePos(имя_файловой_переменной) возвращает номер текущей записи файла в диапазоне от нуля до n-1, где n – количество компонентов, записанных в файле. Номер реальной записи всегда на единицу больше значения, возвращаемого FilePos, и лишь когда текущей записью является маркер «конец файла», эта функция возвращает число, равное реальному количеству компонентов в файле (то же, что и FileSize).
Например:
WriteLn('Номер текущей записи:', FilePos(FI)+1);
If FilePos(FI)=FileSize(FI) then
WriteLn('Обнаружен конец файла');
Закрытие файла
После завершения работы с файлом его обязательно надо закрыть с помощью процедуры:
Close(имя_файловой_переменной);
которая в файл, открытый для вывода, помещает специальную запись – маркер «конец файла».
Закрытие не отменяет связи логического файла с физическим (Assign). Попытка закрыть ещё неоткрытый или уже закрытый файл приведёт к прерыванию выполнения программы. Закрытие файлов гарантирует сохранность записываемой в них информации. Это связано с буферизацией операций ввода-вывода (рис. 1). Буфер – это участок оперативной памяти, закреплённый за открытым файлом и предназначенный для обмена информацией между программой (логическим файлом) и внешней памятью (физическим файлом). При выводе информации записи помещаются в буфер и лишь после его заполнения выводятся на внешний носитель. Закрытие файла (Close) вызывает принудительную очистку буфера ввода-вывода.
Пример:
Close(FI); {Закрыть файл FI}
Рис. 1. Буферизация операций ввода вывода
Текстовые файлы
Текстовые файлы представляют собой последовательность строк, а строки – последовательность символов.
Для описания текстовых файлов в языке Pascal определен стандартный тип Тext:
Var TF1, TF2: Text; {Объявление файловых переменных}
Для работы с текстовыми файлами используются те же подпрограммы, что и применяемые для работы с типизированными файлами (см. п.п. 2.1.2 – 2.1.4, 2.1.6).
Кроме перечисленных процедур и функций, также могут быть использованы следующие:
ReadLn(имя_файловой_переменной, имя_переменной);
Процедура ReadLn читает в переменную текущую строку файла, но после выполнения этого действия процедура автоматически перемещает указатель на начало следующей строки в файле.
WriteLn(имя_файловой_переменной, имя_переменной);
Процедура WriteLn выводит содержимое переменной в текущую строку файла и в конце добавляет символ конца строки, при этом указатель в файле переходит к началу следующей строки.
ReadLn(имя_файловой_переменной); – пропускает строку до начала следующей;
WriteLn(имя_файловой_переменной); – завершает строку файла, в которую производится запись, признаком конца строки и переходит к началу следующей.
Строки текстового файла имеют переменную длину, каждая строка завершается признаком конца строки. С признаком конца строки связана функция EOLn(имя_файловой_переменной). Эта функция возвращает значение true, если достигнут конец строки, и значение false, если конец строки не достигнут. Данная функция применяется, если файл читается посимвольно и необходимо проверить достижение конца строки.
Процедура Append(имя_файловой_переменной) служит для специального открытия текстовых файлов. Она применима к уже существующим физическим файлам и открывает их для добавления информации в конец файла.
В языке Pascal понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт ЭВМ, устройство печати, клавиатура или другие устройства.
Здесь есть возможность связать файловую переменную не только с физическим файлом на носителе информации, но и с устройством. В качестве такового используются псевдонимы устройств:
CON – консоль (экран-клавиатура), то есть при записи в это устройство будет выводиться информация на экран, при чтении информации из этого устройства будет выполняться ввод данных с клавиатуры.
PRN – принтер. При записи в это устройство информация будет выведена на принтер.
Нетипизированные файлы
Нетипизированные файлы позволяют записывать на диск и считывать с диска произвольное количество байтов памяти. Операции обмена с нетипизированными файлами осуществляются с помощью процедур BloсkRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с типизированными файлами.
Перед использованием файла в программе необходимо объявить файловую переменную. Объявление для нетипизированных файлов:
Var f: File;
Далее логический файл должен быть связан с физическим с помощью процедуры Assign (см. п. 2.1.2). Затем файл должен быть открыт процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close (см. п. 2.1.6).
При открытии файла длина буфера устанавливается по умолчанию в 128 байтов. В языке Pascal предусмотрено изменение размера буфера ввода/вывода, для чего следует открывать файл расширенной записью процедур:
Reset(имя_файловой_переменной, размер_буфера);
или
Rewrite(имя_файловой_переменной, размер_буфера);
Параметр размер_буфера задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение буфера – 1 байт, максимальное – 64 Кбайтов.
Чтение данных из нетипизированного файла осуществляется процедурой:
BlockRead (имя_файловой_переменной,
переменная, количество_блоков [, количество_прочитанных_блоков]);
Эта процедура осуществляет за одно обращение чтение в переменную, количество_блоков устанавливает количество считываемых блоков за одну операцию вывода, определенных размером буфера. Значение третьего параметра не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 Кб.
Необязательный параметр количество_прочитанных_блоков возвращает число блоков, прочитанных текущей операцией BlockRead.
В случае успешного завершения операции чтения количество_блоков = количество_прочитанных_блоков, а также в случае аварийной ситуации последний параметр будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью этого параметра можно контролировать правильность выполнения операции чтения.
Запись данных в нетипизированный файл выполняется процедурой:
BlockWrite ( имя_файловой_переменной,
переменная, количество_блоков
[, количество_прочитанных_блоков]);
BlockWrite осуществляет за одно обращение запись из переменной, количество_блоков устанавливает количество записываемых блоков за одну операцию ввода, определенных размером буфера.
Необязательный параметр количество_прочитанных_блоков возвращает число блоков, записанных успешно текущей операцией BlockWrite.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|