Работа с файлами
Модули
Модули используют в более поздних версиях Паскаля для создания библиотек разделения больших программ на логически связанные независимые друг от друга составные части.
В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовке: и доступные пользователям в теле основной программы. Раздел «реализация» содержит тела процедур и функций, перечисленных в интерфейсной части модуля Раздел «инициализация» содержит операторы, необходимые для инициализации модуля. Таким образом, модуль – это набор констант, типов данных, переменных, процедур и функций. Каждый модуль компилируется отдельно; результат компиляции – файл с расширением .tpu (Turbo Pascal Unit). Каждый элемент модуля можно использовать в программе пользователя без дополнительного объявления, для чего достаточно записать имя используемого модуля в директиве uses в начале программы после его заголовка.
В Турбо Паскале версии 5.0 и выше применяют стандартные модули CRT, GRAPH и др. В этих модулях содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиатурой, графическими примитивами и т.п. Модули подключаются к программе путем специальной команды, размещаемой сразу после заголовка:
uses <имя модуля>
Программист может сам создать модуль. Ниже приведен пример с соответствующими комментариями.
Пример 4. Создать модуль, дополняющий математические возможности Паскаля арифметическими действиями над комплексными числами.
Будем представлять комплексные числа парами действительных: (а, b). Как известно, действия над ними выполняются по правилам
(a, b) + (с, d) = (а + с, b + d);
(a,b) - (c,d) = (a-c,b-d);
(a,b)*(c,d) = (a*c-b*d,a*d+b*c);
(a, b)/(c, d) = ((a*c + b*d)/(c*c+d*d),(b*c-a*d)/(c*c + d*d)).
Создаваемый модуль будет включать четыре процедуры: Sum – сумма, Raz – разность, Proiz – произведение, Chastn – частное.
Этот модуль может быть отдельно откомпилирован. После этого любая программа, написанная на Паскале, может получить доступ к интерфейсным объектам (в данном случае – процедурам) этого модуля с помощью директивы Uses CompChisla.
Обратим внимание, что в интерфейсной части модуля от процедур присутствуют лишь заголовки, а в части «реализация» от заголовков процедур остаются лишь их имена.
Файл (последовательность) – это одна из наиболее фундаментальных структур данных. Программная организация компьютеров, их связь с внешними устройствами основаны на файловой структуре.
Благодаря файлам становится возможным:
1) формирование и сохранение значений для последующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна);
2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п.
В Паскале это обеспечивается с помощью структурированных данных файлового типа.
Файловый тип данных в программе задается следующим образом:
type <имя файлового типа> = file of <тип компонентов>
В качестве типа компонентов файла разрешается использовать любой тип данных, кроме файлового. Например:
type
intfile = file of integer;
refile = file of real;
chfile = file of char;
ran = 1..10;
st = set of ran;
vector = array[ran] of real;
compl = record
re,im: integer;
end;
setfile = file of st;
vecfile = file of vector;
compfile = file of compl;
Описание файловой переменной задается обычным способом в разделе описаний. Например:
var f: intfile; или var f: file of integer;
Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется oпepатором языка Паскаль:
assign (<имя файловой переменной>,'<имя устройства>’)
Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если, например, файл с именем primer.dat логически связан с дисководом А то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, а установка «окна» между программой и файлом будет определяться через файловую переменную f оператором
assign (f,'primer.dat')
Если внешним устройством является принтер, то связь осуществляется oпepатором assign (f, '1st:'). Здесь 1st – логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода:
con – консоль; trm – терминал; kbd – клавиатура; 1st – принтер; aux – буфер сети; usr – драйвер пользователя.
После осуществления связи файловая переменная f отождествляется с соответствующим файлом.
Для работы с файлом его необходимо открыть, а по окончании работы – закрыть. Файл открывается для чтения оператором reset (f), для записи –оператором rewrite(f).
Чтение и запись данных осуществляется известными командами read/write, только в начале списка помещается имя файловой переменной:
read (f, <список ввода>); readln (f, <список ввода>); write (f, <список вывода>); writeln(f, <список вывода>)
Закрытие файла осуществляется командой close (f).
На практике широко используются текстовые файлы, которые состоят из литерных (логических) строк. Поэтому в языке Паскаль предусмотрен стандартный файловый тип text (он не является file of char, скорее всего, это file of string [ n ]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (eoln — «end оf line»). В качестве печатного символа конца строки используют литеру #. Текстовый файл (text) является строго последовательным, к нему неприменимы некоторые встроенные функции, в частности seek. В отличие от типизированных файлов, с текстовым файлом нельзя одновременно проводить операции чтения (read) и записи (write). Однако допустимы операторы writeln и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел.
Ниже приведен пример, иллюстрирующий работу с файлами.
Пример. Вывод данных на печатающее устройство – принтер (1st:).
Программа 23
program print;
var
fal: text; x: real; name: string[25];
begin
assign(fal,’1st:’); rewrite(fal); x:=2.5; name:=’Слава’;
writeln(fal,x:8:2);
writeln(fal,’Привет, ‘,name); close (fal)
end. {Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на печать}.