Как создать типизированный файл в паскале

от admin

24. Типизированные файлы. Создание и просмотр файлов.

Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа (последовательный+прямой). Основным свойством этих файлов является то, что их структура данных представляет собой последовательностькомпонентов одного типа. Описывают подобный файл словосочетаниемfile ofс последующим указанием типа компонентов файла, число которых (длина файла) не фиксируется:

varимя_файла:fileofтип_компонентов

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

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла(операторAssign). Затем нужно открыть его (используются операторыResetиRewrite, но неAppend). ОператорыResetиRewriteоткрывают файли для чтения, и для записи(а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что операторResetоткрывает толькосуществующийфайл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, операторRewriteсоздает новый файл (еслифайл с таким именем ужеимеется, то онбудет уничтожени создан заново). При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла,на который ссылается указательфайла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент. Чтение из типизированного файла производится операторомRead(но неReadLn), а запись в него — операторомWrite(но неWriteLn). Однако следует помнить, что в списке вывода оператора Write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.

Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize, для которой используется следующий синтаксис:

Элементы типизированного файла нумеруются с нуля(порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функциюFilePos:

Текущим положением указателя можно управлять, для чего служит процедура Seek, которая использует следующий синтаксис:

Второй параметр (тип LongInt) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла.

Как и для текстовых файлов, можно использовать функцию Eof(имя_файла), которая возвращает значениеTrue, если текущий указатель расположен на признаке конца файла (т. е. при выполнения равенстваFilePos(имя_файла) = FileSize(имя_файла)).

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

Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.

Программирование. Файлы Pascal-Паскаль

Существенной особенностью всех рассмотренных до сих пор значений производных типов является наличие в них конечного, наперед заданного числа компонент. Так, в значении многомерного массива это число можно определить, зная количество компонент по каждому измерению, а в значении записи это число определяется количеством и типом полей. Таким образом, заранее, еще до выполнения программы, по этому описанию можно выделить необходимый объем памяти машины для хранения значений переменных этих типов. Но существует определенный класс задач и определенные ситуации, когда количество компонент (пусть даже одного и того же из известных уже типов) заранее определить невозможно, оно выясняется только в процессе решения задачи. Поэтому возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этих последовательностей заранее не определяется, а конкретизируется в процессе выполнения программы. Этот тип значений получил название файлового типа. Условно файл в Паскале можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на эту ленту последовательно друг за другом:

где F – имя файла, а F1, F2, F3, F4 – его элементы. Файл во многом напоминает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам:файлы последовательного доступа и файлы произвольного доступа.

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

Файлы произвольного доступа Паскаля позволяют вызывать компоненты в любом порядке по их номеру.

Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип Паскаля – это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.

Работа с файлами в Паскале

Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов». В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файловый тип или переменную файлового типа в Паскале можно задать одним из трех способов:

Здесь <имя_ф_типа> – имя файлового типа (правильный идентификатор); File, of – зарезервированные слова (файл, из); <тип_элементов> – любой тип Паскаля, кроме файлов.

Пример описания файлового типа в Паскале

В зависимости от способа объявления можно выделить три вида файлов Паскаля:

  • типизированные файлы Паскаля(задаются предложением file of..);
  • текстовые файлы Паскаля(определяются типом text);
  • нетипизированные файлы Паскаля(определяются типом file).

Следует помнить, что физические файлы на магнитных дисках и переменные файлового типа в программе на Паскале – объекты различные. Переменные файлового типа в Паскале могут соответствовать не только физическим файлам, но и логическим устройствам, связанным с вводом/выводом информации. Например, клавиатуре и экрану соответствуют файлы со стандартными именами Input, Output.

Как известно, каждый тип данных в Паскале, вообще говоря, определяет множество значений и множество операций над значениями этого типа. Однако над значениями файлового типа Паскаля не определены какие-либо операции, в том числе операции отношения и присваивания, так что даже такое простое действие, как присваивание значения одной файловой переменной другой файловой переменной, имеющей тот же самый тип, запрещено. Все операции могут производиться лишь с элементами (компонентами) файлов. Естественно, что множество операций над компонентами файла определяется типом компонент.

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

Основные процедуры и функции для работы с файлами

1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:

Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например:

Пример процедуры Assign в Паскале

Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.

Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:

CON – консоль, т.е. клавиатура-дисплей;

PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.

Не разрешается связывать с одним физическим файлом более одной файловой переменной.

2.После окончания работы с файлами на Паскале, они должны быть закрыты.

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

Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.

3.Подготовка к записи в файл Паскаля

Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:

файл Паскаля (Pascal)

4.Запись в файл Паскаля

При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла. Результат действия процедуры write(f, x) можно изобразить так:

Состояние файла f до выполнения процедуры

файл Паскаля (Pascal)

Состояние файла f после выполнения процедуры

файл Паскаля (Pascal)

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

5.Подготовка файла к чтению Паскаля

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

файл Паскаля (Pascal)

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

6.Чтение из файла в Паскале

Рассмотрим результат действия процедуры read(f, v):

Состояние файла f и переменной v до выполнения процедуры:

файл Паскаля (Pascal)

Состояние файла f и переменной v после выполнения процедуры:

файл Паскаля (Pascal)

Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.

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

7.Функция определения достижения конца файла в Паскале

Читать:
Что должен знать программист 1с стажер

Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.

8.Изменение имени файла в Паскале

Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.

Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

9.Уничтожение файла в Паскале

Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

10.Уничтожение части файла от текущей позиции указателя до конца в Паскале

11.Файл Паскаля может быть открыт для добавления записей в конец файла

Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).

Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.

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

fileSize(<имя_ф_переменной>) – функция Паскаля, определяющая число компонентов в файле;

filePos(<имя_ф_переменной>) – функция Паскаля, значением которой является текущая позиция указателя;

seek(<имя_ф_переменной>,n) – процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek(<имя_ф_переменной>,0) установит указатель в начало файла, а процедура seek(<имя_ф_переменной>, FileSize(<имя_ф_переменной>)) установит указатель на признак конца файла.

Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.

Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.

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

  • текстовые файлы удобнее для восприятия человеком, а типизированные соответствуют машинному представлению объектов;
  • текстовые файлы, как правило, длиннее типизированных;
  • длина текстовых файлов зависит не только от количества записей, но и от величины переменных.

Так, в типизированном файле числа 6, 65 и 165 как целые будут представлены одним и тем же числом байт. А в текстовых файлах, после преобразования в строку, они будут иметь разную длину. Это вызывает проблемы при расшифровке текстовых файлов. Пусть в текстовый файл пишутся подряд целые числа (типа byte): 2, 12, 2, 128. Тогда в файле образуется запись 2122128. При попытке прочитать из такого файла переменную типа byte программа прочитает всю строку и выдаст сообщение об ошибке, связанной с переполнением диапазона.

Но, вообще-то, такой файл не понимает не только машина, а и человек.

Чтобы избежать этой ошибки, достаточно вставить при записи в файл после каждой переменной пробел. Тогда программа при каждом чтении берет символы от пробела до пробела и правильно преобразует текстовое представление в число.

Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.

Пример решения задачи с файлами Паскаля

Пусть нам необходимо сформировать текстовый файл с помощью Паскаля, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».

Пояснения: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго.

Для завершенности решения задачи есть смысл добавить еще одну часть, которая в задаче явно не указана – вывод на экран содержимого второго файла.

Типизированные файлы в Паскаль.

Типизированный файл – это файл, в котором содержатся однотипные данные. Типизированный файл задается с помощью 2-х ключевых слов «file of». После слова «of» указывается тип файла, например integer, real, char, string и т.д. Тип файла может быть любым за исключением файлового типа (не может быть файла файлов) и комбинированного типа, один из компонентов которого имеет файловый тип.

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

Напишем программу, которая создаст своеобразную базу данных, хранящей сведения о студентах: их именах, номерах курса и групп.

Типизированные файлы в Паскаль.

Строка №3-№6. Объявляем в программе тип Record и указываем для него компоненты. Первый компонент «fio» (строка №4) будет описывать фамилию и инициалы студента. Компоненты «kurs» и «group» будут описывать соответственно номер курса и номер группы.

Строка №7. Объявляем переменную «zap» и указываем для нее тип «Student». Теперь с помощью переменной «zap» мы можем обратиться к любому компоненту записи.

Строка №8. Создаем файловую переменную «f» и указываем для нее тип «Student». Таким образом, мы создаем файл записей, где будет храниться информация о студентах.

В строке №9 создаем переменную «name», которая понадобится нам для создания имени файла.

Строка №13. Вводим с клавиатуры имя файла. Это имя будет записано в переменную «name».

Строка №14. Связываем файловую переменную «f» с именем файла. Как и в случае с текстовыми файлами связывание файловой переменной с файлом производится с помощью процедуры Assign

Строка №15. Открываем файл для записи. Открытие типизированного файла для записи производится аналогично текстовым файлам с помощью процедуры Rewrite. Так как самого файла не существует, он будет создан автоматически и будет иметь имя, которое мы задали в строке №13.

Строка №17. После вывода на экран сообщения (строка №16) мы вводим значение для 1-ого компонента записи (фамилию и инициалы студента).

Строка №18. Записываем цикл. До тех пор пока не будет введено пустое значение для компонента «zap.fio» необходимо выполнять действия, записанные в строках №20 — №24. Знак <> означает неравно. После этого знака в апострофах записывается значение, которому не должен быть равен компонент «zap.fio». Внутри апострофов мы ставим знак пробела. Таким образом, цикл будет выполняться до тех пор, пока вместо фамилии очередного студента не будет нажата клавиша «пробел».

В цикле будут выполняться поочередно 4 действия:

  • Строка №20. Выводим на экран сообщение.
  • Строка №21. Вводим с клавиатуры через пробел номер курса и номер группы.
  • Строка №22. В файловую переменную «f» заносим содержимое записи «zap».
  • Строка №23. Выводим на экран сообщение.
  • Строка №24. Вводим с клавиатуры фамилию и имя студента.

Эти строки будут повторяться в цикле, пока на предложение ввести фамилию и инициалы студента мы просто нажмем пробел. После этого файл будет закрыт (строка №26) и на экран будет выведено сообщение (строка №27).

Как создать типизированный файл в паскале

Типизированные файлы – это файлы, состоящие из нумерованной последовательности объектов (записей) любого типа. С такими файлами можно работать в режиме прямого доступа, при котором выполняется непосредственное об­ращение к любой записи файла. Каждая запись файла имеет свой номер, начиная с 0 и т.д.
Процедуры и функции обработки файлов:

1) Write и Read- записывают и читают информацию из указанного файла и перемещают указатель файла к сле­дующей записи.
2) Seek (файловая переменная, номер записи); процедура перемещения указателя на запись файла с заданным номером.
3) Truncate (файловая переменная); процедура, усекающая файл по текущей позиции указа­теля файла, т.е. все записи, находящиеся после указателя фай­ла, удаляются.
4) Функция Filesize (файловая переменная); имеет тип Integer и определяет размер файла, т.е. число записей.
5) Функция Filepos (файловая переменная); имеет тип Integer и возвращает текущую позицию указателя файла.

Для добавления записей в конец файла используются процедуры:

Readln (a );
Seek (f, filesize (f));
Write (f, a);

При этом указатель устанавливается за конец файла, т.к. нуме­рация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только проце­дурой Reset (f).
Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вы­зова процедуры Seek.Один вызов перед операцией Read, а другой — перед операцией Write (т.к. Read после чтения записи переместит указатель к сле­дующей записи).

Пример: Cоздать файл из списка 10 студентов с их оценками ( номер, Ф.И.О. и три оценки). Вывести его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры, заново прочитать файл.

Program file;
Type
wed = record <Тип wed включает 3 поля: n, fio, bal>
n : byte ; fio : string[15] ;
bal : array [1..3] of byte; <Поле bal – массив из 3 оценок >
end;
Var spisok : wed ; <Запись spicok типа wed>
sp : file of wed;

procedure vvod ; < процедура создания файла>
var i , j : byte ;
begin
< оператор assing находится в основной прграмме >
rewrite ( sp ); <открытие файла для записи>
with spisok do
For i :=1 to 10 do begin
n := i ;
writeln (‘ Введите фамилию — ‘, i );

readln (fio);
writeln (‘ Введите 3 оценки ‘, fio );

For j:= 1 to 3 do

procedure print; < процедура чтения и печати всего файла >
var j : byte;
begin
reset ( sp); < открытие файла для чтения >
writeln (‘ Список студентов : ‘);
while not eof (sp) do
with spisok do
begin
Read (sp, spisok); < чтение данных из файла >
write (n,’ ‘,fio); < вывод записи на экран >
For j:= 1 to 3 do

write (‘ ‘, bal [j] );
writeln ;
end;
readln;
close (sp) ;
end;

Похожие статьи