Для работы с файлами прямого доступа дополнительно можно использовать следующие средства:
Truncate(var F);
Процедура уничтожает все компоненты файла F, начиная с места текущего положения файлового указателя.
FilePos(var F) : Longint
Функция возвращает для файла F текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longint
FileSize(var F) : Longint
и его размер (количество записей) в виде значения типа Longint.
Для пустого файла вызов FileSize возвращает значение 0. Локализация ошибок при обращении к внешним носителям для обоих функций производится через IOresult.
Для того чтобы очередная запись могла быть записана в конец типизированного файла, необходимо перевести текущую файловую позицию в конец файла. Когда создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установленная по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)),то в конец файла ее позволяет перевести вызов
Работа с файлами в консольном режиме. Среда разработки Lazarus.
Seek(F, FiieSize(F));
В каждом файле число логических и физических записей совпадает, а при позиционировании номер физической записи на единицу меньше номера логической записи.
Когда записи располагаются в неотсортированном по фамилиям порядке, поиск необходимо осуществлять последовательно по всему файлу. Такое расположение записей требует значительных расходов ресурсов системы для поиска нужной записи. Любая программная система по манипулированию базами данных всегда имеет в своем составе средства упорядочения записей по ключу.
Ключом называется совокупность знаков, идентифицирующая запись в файле. Ключ сортировки — одно или несколько полей в записи файла, по содержимому которых осуществляется упорядочение его записей, например список учащихся в классном журнале отсортирован по ключу фамилия.
На практике это выражается в создании так называемых индексных файлов по отношению к главному файлу данных. Индексные файлы содержат номера записей главного файла, отсортированных по конкретному ключу. Такое построение позволяет экономить время обращения к внешним носителям, так как во всех перемещениях при сортировке участвуют записи малой длины, содержащие номера записей главного файла в соответствии с ключом сортировки.
Пример программы работы с типизированным файлом
Пусть требуется составить программу, которая создает на диске файл данных “Телефонного справочника”, обеспечивает ввод и изменение данных, поиск номера телефона по фамилии абонента.
Write(‘Введите имя файла данных телефонного справочника’);
Writeln(‘Ввод записи № ’, FilePos(BookFile)+1);
Write(‘Введите номер телефона ’);
Writeln(‘Создание записей файла ’, Name);
Write(‘Введите число записей в справочнике’);
For Ind:=1 to Count do
Writeln(‘Создание фала завершено’);
Writeln(‘Файл данных имеет , FileSize(BookFile), записи’);
Программирование в Delphi Урок 10. Работа с Ini-файлами. Классы / Илья Хохлов
Writeln(‘ФИО: ’, Fio, ‘телефон: ’,Phone);
if IOResult=0 then
Writeln(‘Вывод телефонного справочника из файла’, Name);
While (not EOF(BookFile)) do
Writeln(‘Файла с именем ’ +Name+’ на диске нет’);
if IOResult=0 then
Write(‘Укажите номер изменяемой записи’);
Writeln(‘–Старое значение записи:’);
Writeln(‘Задаем новое значение ’, NumRec, ‘записи’);
Writeln(‘Файла с именем ’+Name+’ на диске нет’);
if IOResult=0 then
Writeln(‘Измененный файл данных имеет’, FileSize(BookFile),’записи’);
Writeln(‘Файла с именем ’+Name+’ на диске нет);
BookFile:file of RecBook;
if IOResult=0 then
Write(‘Введите фамилию для поиска’);
Writeln(‘Фамилия ’, Fio,’телефон ’,Phone);
If Rez_Find then
Writeln(‘Число записей для ’, Maska,’=’,CountRec)
Writeln(‘В справочнике нет абонентов с фамилией ’, Maska);
Writeln(‘Файла с именем ’+Name+’ на диске нет’);
Writeln(‘Выберите вид работы ’);
Writeln(‘1-создание нового файла ’);
Writeln(‘2-просмотр списка справочника ’);
Writeln(‘Нажмите клавишу Enter’);
В начале программы очищается экран, переменной End_Menu присваивается значение False, и затем на него с помощью оператора повтора repeat выводится текст меню из шести пунктов. В заключение списка вариантов меню выводится запрос и считывается значение переменной Vid, задаваемое пользователем в соответствии с избранным видом работы со справочником.
В зависимости от значения селектора Vid оператор выбора case осуществляет выбор, т. е. выбирают соответствующую значению константы выбора процедуру (например, если Vid=2, то вызывается процедура OutputAllRec для вывода всего содержимого справочника). После выполнения процедуры управление программой передается в конец оператора case, и, так как значение переменной End_Menu не равно True, оператор повтора repeat выполняется вновь, очищая экран и выводя список меню, и так до тех пор, пока пользователь выберет завершение работы. В результате этого переменной Vid будет присвоено значение 0, из-за чего в операторе case переменной End_Menu будет присвоено значение True, и цикл repeat завершится.
В начале процедуры создания нового файла данных справочника записан вызов процедуры задания имени файла данных Name_File. Процедура Name_File записана выше по тексту программы. Создание нового файла данных производится с использованием стандартной процедуры Rewrite. Ввод записей об абонентах описывается с использованием оператора повтора for, параметр Ind которого, изменяясь от 1 до числа записей Count, будет указывать порядковый номер записи с данными абонента в файле. Добавление одной записи в файл данных сделанов виде процедуры AddRec, которая также записана выше в тексте программы.
В окончании процедуры организуется вывод сообщения о результатах создания файла. Для измерения размера файла в записях используется функция FileSize.
Для сокращения записи при обращении к полям Fio и Phone переменной типа запись Work используется предложение with Work do.
Для вывода на экран всех записей файла сначала, используется функция IOresult, выполняется проверку, есть ли данный файл на диске. Если функция IOresult возвращает значение, отличное от 0, то на экран выводится сообщение о том, что данного файла на диске нет, иначе позиционируется указатель на первую запись Seek(BookFile, 0), а затем, используя оператор повтора while, записывается вызов процедуры вывода на экран одной записи OutputRec. Условием окончания цикла while будет выражение Eof(BookFile). Как только оно выполнится, цикл завершится. Данные всех записей файла выведены на экран.
В процедуре поиска номера телефона описаны локальные переменные: Maska типа StFio, которая будет принимать значение фамилии искомого абонента; Rez_Find типа boolean, которая будет принимать значения True или False в зависимости от результатов поиска; CountRec типа integer, значение которой будет равно числу записей с такой фамилией.
После записи запроса имени файла данных справочника и проверки есть ли он на диске, в случае если файл есть, записывается запрос о фамилии искомого абонента. Перед поиском присвоено значения Rez_Find:=False и CountRec:=0. Просмотр всех записей файла данных при поиске записан, используя оператор повтора while. Условие завершения поиска- Eof(BookFile) — достижение конца файла. Если значение поля Fio очередной записи совпадает со значением переменной Maska, то переменной Rez_Find присваивается значение True (абонент найден), значение переменной CountRec увеличивается на 1 и печатается сообщение о фамилии и номере телефона найденного абонента.
Порядок выполнения работы
- Изучить теоретические сведения по теме “ Разработка программы для работы с типизированным файлом”.
- Получить у преподавателя индивидуальное задание и разработать программу для работы с типизированным файлом согласно заданному варианту.
- Показать работающую программу преподавателю.
- Ответить на контрольные вопросы.
- Понятие типизированного файла.
- Средства работы с типизированными файлами.
- Пример программы для работы с типизированными файлами.
Лабораторная работа № 30
Разработка программы для работы с нетипизированным файлом
Цель работы: формирование знаний и умений по работе с нетипизированными файлами.
Краткие теоретические сведения
Файлами, поддержка которых осуществляется с максимально возможной скоростью являются нетипизированные файлы. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность программ, участвующих в интенсивном обмене с внешними наборами данных. Эти файлы в отличие от текстовых и типизированных не имеют строго определенного типа.
Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление Char или Byte не играет никакой роли, а важно лишь относительно объема занимаемых данных. Для определения в программе нетипизированного файла служит зарезервированное слово File:
UntypedFile : File;
Внутренняя поддержка таких файлов выглядит наиболее близкой к аппаратной поддержке работы с внешними носителями. За счет этого достигается максимально возможная скорость доступа к наборам данных. Для нетипизированных файлов не нужно терять время на преобразование типов и поиск управляющих последовательностей, достаточно считать содержимое файла в определенную область памяти. Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи. Для таких файлов самым важным параметром служит длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:
Rewrite(UntypedFile, 1) ; или
Reset(UntypedFile, 1) ;
Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы.
Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов:
Rewrite(UntypedFile) ; или
Reset(UntypedFile) ;
все процедуры и функции, обслуживающие файлы прямого доступа, работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи.
Используя для базовых операций ввода-вывода с нетипизированными файлами стандартные процедуры Read и Write, нельзя добиться большой эффективности в скорости передачи данных. Поэтому только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью.
Источник: studfile.net
Типизированные файлы в Паскаль
Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа. Основным свойством этих файлов является то, что их структура данных представляет собой последовательность компонентов одного типа.
При описании типизированных файлов указывается тип его компонентов, число которых (длина файла) не фиксируется:
var имя_файла: file of тип_компонентов
Поскольку известен тип элементов файла, а следовательно, и объем памяти, отводимой под каждый из них, можно рассчитать позицию каждого из элементов внутри файла. Это позволяет организовать непосредственный доступ к любому элементу типизированного файла. Пусть имеется такое определение переменной:
var FileInt: file of Integer;
В этом описании указано, что элементами файла являются данные типа Integer , занимающие 2 байта (или 4). При этом отпадает необходимость в специальном разделении элементов файла, как это делалось в текстовых файлах. Также возможен произвольный доступ к элементам данных (этим типизированный файл несколько напоминает одномерный массив).
Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла (оператор assign ). Затем нужно открыть его (используются операторы reset или rewrite ).
Операторы reset и rewrite открывают файл и для чтения, и для записи (а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что оператор reset открывает только существующий файл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, оператор rewrite создает новый файл (если файл с таким именем уже имеется, то он будет уничтожен и создан заново).
При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла, на который ссылается указатель файла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент.
Чтение из типизированного файла производится оператором read (но не readln ), а запись в него — оператором write (но не writeln ). Однако следует помнить, что в списке вывода оператора write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.
Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize , для которой используется следующий синтаксис:
Например, если переменная k имеет тип LongInt , а f – файловая переменная типизированного файла, то выражение k := FileSize(f) , записывает в переменную k размер файла f .
Элементы типизированного файла нумеруются с нуля (порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функцию FilePos :
FilePos(имя_файла)
Текущим положением указателя можно управлять, для чего служит процедура Seek , которая использует следующий синтаксис:
Seek(имя_файла, номер_элемента)
Второй параметр (тип LongInt ) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла. Рассмотрим несколько примеров.
Перейти к пятому (фактически шестому) элементу файла f :
Seek(f, 5);
Перейти к предыдущему элементу:
Seek(f, FilePos(f)-1);
Перейти в конец файла:
Seek(f, FileSize(f)-1);
Как и для текстовых файлов, можно использовать функцию Eof(имя_файла) , которая возвращает значение True , если текущий указатель расположен на признаке конца файла (то есть при выполнения равенства FilePos(имя_файла) = FileSize(имя_файла) ).
Процедура seek и функции FilePos и FileSize позволяют легко осуществлять коррекцию элементов типизированного файла, имя которого указано в качестве е параметра, начиная с элемента, на котором расположен указатель. Однако уничтожить элемент внутри файла нельзя, для этого файл должен быть перезаписан.
Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.
Пример записи данных в типизированный файл:
type t_subscriber = record surname: string[20]; tel: LongInt; end; var subscriber: t_subscriber; f: file of t_subscriber; i: Integer; begin Assign(f,’notebook.dat’); Rewrite(f); for i:=1 to 5 do begin with subscriber do begin Write(‘Surname: ‘); ReadLn(surname); Write(‘Phone: ‘); ReadLn(tel); end; Write(f, subscriber); end; Close(f); end.
Пример последовательного доступа к типизированному файлу:
type t_subscriber = record surname: string[20]; tel: LongInt; end; var subscriber: t_subscriber; f: file of t_subscriber; s: string[7]; begin Assign(f,’notebook.dat’); Reset(f); while not Eof(f) do begin Read(f, subscriber); with subscriber do begin str(tel,s); if Copy(s,1,2) = ’33’ then tel := tel+4000000; end; Seek(f,FilePos(f)-1); // возврат указателя назад Write(f,subscriber); end; Close(f); end.
В приведенной программе типизированный файл обрабатывается и как файл последовательного доступа, и как файл произвольного доступа.
Источник: pas1.ru
Пример программы для работы с типизированными файлами
Пусть требуется составить программу, которая создает нетипизированный файл из 100 вещественных чисел и выводит на экран k-й элемент файла. Проиллюстрируем обработку созданного файла двумя разными способами: поиск элемента в файле данных прямого доступа по его номеру и поиск элемента в файле данных с последовательным доступом.
В разделе описания переменных опишем файловую переменную F, представляющую в программе нетипизированный файл вещественных чисел; вещественную переменную Р, которой будет присваиваться значение очередного элемента файла при заполнении файла случайными вещественными числами и искомого элемента файла; целую переменную типа byte К, значения которой будут указывать на номер элемента в файле.
Источник: studopedia.ru