Функции LENGTH и CONCAT.

Функция Length возвращает в качестве значения длину строки. Например, если в строковой переменной «stroka» записано слово «Pascal», то Length(stroka) будет равно 6. Эта операция аналогична операции Ord(stroka[0]), которую мы разбирали в 1-м уроке. ...

Процедуры Dec и Inc в Pascal.

При работе с целыми числами используются процедуры DEC и INC. Процедура Dec уменьшает число на определенное значение, а процедура Inc увеличивает число на определенное значение.

Процедуры STR и VAL.

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

...

Циклы и массивы

Подпрограммы, определенные пользователем.

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

Использование массивов и функций в качестве формального параметра.

Формальным параметром функции может быть не только переменная скалярного типа, но и идентификатор переменной структурированного типа данных.

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

Напомним, что файл — это структурированный тип данных, состоящий из компонентов одного типа. Файлы записей часто называют базой данных и относят к так называемым типизированным файлам. Типизированный Файл с точки зрения языка ПАСКАЛЬ — это структурированный тип данных, состоящий из последовательности компонентов одного типа и одной длины. Для типизированных файлов файловый тип и файловую переменную задают с помощью следующей синтаксической конструкции:

TYPE    <Имя типа файла> = FILE OF <Тип компонент файла>;
VAR     <Идентификатор файловой переменной>: <Имя типа файла>;

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

Определение типа файлов начинается ключевыми словами FILE OF, после которых задается тип компонентов файла, который описывает, что содержит данный файл. Далее следует идентификатор предварительно определенного типа файла. Число компонентов, называемое длиной файла, определением типа файла не фиксируется.

Идентификатор файловой переменной определяет имя файла в программе. Можно в разделе VAR определить несколько файловых переменных, что дает возможность программе работать одновременно с несколькими файлами одного или различных типов. В качестве примера приведем фрагмент программы, работающей с файлом Fstd базы данных, хранящим сведения о студентах:

Type Student = record
Tab: Longint; {Номер зачетной книжки}
Fio: String[20]; {Фамилия И.О.} 
Data: String[8]; {Дата рождения} 
Group: String[7]; {Номер группы} 
Stepa: Real {Размер стипендии, руб.}
end;
Var Std: Student; Mstd: array[0.. 19] of Student; 
Fstd: File of Student;

В этом примере имя типа файла в явном виде не используется. Для описания файла использован второй способ, так называемое неявное определение файлового типа непосредственно в разделе VAR:

VAR F: file of <тип компонент>;

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

Структура файла.

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

  • закрыт для чтения и записи;
  • открыт для записи, закрыт для чтения;
  • открыт для чтения закрыт для записи компонент;
  • открыт для чтения, открыт для записи компонент.

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

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

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

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

Концептуальная схема файла приведена на рис.1

Структура файла

На рис. 1. а) представлен файл, с именем S, содержащий N компонент (записей). А на рис. 1. б) изображен пустой файл, в котором нет ни одной компоненты, только название и метка конца файла EOF.

Каждому файлу пользователя должно быть присвоено уникальное имя (в рамках каталога, в котором этот файл хранится), которое используется при обращении к этому файлу. Имя должно соответствовать стандарту MS-DOS и состоит из собственно имени (от 1 до 8 символов: букв или цифр) и необязательного типа файла (до 3-х символов). Если тип файла присутствует, он отделяется от первой части имени точкой. Тип файла присваивается обычно в мнемонической зависимости от содержимого файла.

Пример имени файла: STUDENTS.DAT

Для обращения к файлу необходимо указать путь, то есть имя диска, на котором расположен нужный файл (А, В, С, D, Е...), корневой директорий и поддиректории, если они есть. Пример пути и имени файла, расположенного в корневом каталоге на диске:

D:\STUDENTS.DAT.

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

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

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

VAR F: FILE OF <тип компонент>;

Assign (F, ST) — присвоить в программе имя файлу. Имя файла, которое является значением ST (строка текста типа String), ставится в соответствие с переменной файлового типа F. С момента выполнения процедуры Assign все действия над этой переменной будут эквивалентны действиям над файлом с именем, определяемым значением ST.

Rewrite (F) — создать новый пустой файл. Эта процедура служит для создания нового файла на диске. Имя файла должно быть предварительно определено в процедуре Assign. Если на диске уже был файл с таким именем, он уничтожается. Указатель файла устанавливается в первую позицию (с номером 0). Фактически файл не содержит ни одного компонента, он только подготовлен для загрузки (см. схему на рис. 2).

Состояние файла F после выполнения команды Rewrite (F)

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

Read (F, Z) — читать текущий компонент из файла. С помощью этой команды производится чтение из дискового файла, определенного файловой переменной F значений Z1, Z2,..., ZN. После завершения выполнения процедуры, то есть чтения текущего компонента в переменную Z, указатель файла устанавливается на следующий компонент (запись).

Write (F, Z) — записать новый компонент в файл. Переменные Z1, Z2,..., ZN записываются в дисковый файл, определенный переменной F. После выполнения процедуры указатель перемещается к следующему компоненту.

Seek (F, к) — установить указатель на компонент Zk с порядковым номером k в файле. Указатель перемещается к компоненту с номером k, начиная счет с нуля, то есть первый компонент имеет номер 0, второй — 1, третий — 2 и т. д.

Close(F) — закрыть файл. Выполнение процедуры обеспечивает закрытие файлла, назначенного переменной F. Если файл был открыт, никогда не следует выходить из программы, предварительно не закрыв его.

Erase(F) — уничтожить файл. Выполнение процедуры вызывает уничтожение файла, назначенного переменной F. Если производится уничтожение открытого файла, его необходимо предварительно закрыть с помощью процедуры Close.

Rename(F, ST) — переименовать файл. Выполнение процедуры вызывает занесение в каталог диска (директорий) нового имени файла, определенного перемен ной F. Новое имя определяется значением текста в строке ST.

Truncate (F) — уничтожить все компоненты файла, начиная с места текущего положения указателя, и подготовить файл для записи.

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

Eof (F) — проверить маркер "конец файла". Значение функции равно TRUE если указатель файла находится сразу за последним компонентом файла, и FALSE в любом другом случае.

FilePos (F) — определить текущий номер компонента. Функция возвращает целочисленное значение, равное номеру компонента, на котором установлен в данный момент указатель файла, соответствующего переменной F. Отсчет номера компонента начинается с нуля.

FileSize (F) — определить размер файла. Функция возвращает целочисленное значение, равное количеству компонентов файла, соответствующего переменной F. Эта функция обычно используется для проверки, содержит файл какую-либо информацию или является пустым. Если FileSize (F) = 0, то файл пуст, в другом случае файл содержит данные.

IOResult (F) — проверить результат выполнения последней операции ввода вывода на наличие ошибок. Если ошибка обнаружена, функция возвращает номер ошибки, если ошибок нет, возвращает значение 0. Эта функция используется при пассивном состоянии директивы {$1-} для организации обработки ошибок ввода вывода самим пользователем. Покупайте качественные женские часы наручные по доступным ценам. Если программа для обработки ошибок отсутствует, наличие ошибки ввода-вывода не вызывает прерывания программы и выполняется следующий оператор.

   ГлавнаяПаскальЛекции по Pascal. Часть 2.Массив символов.