Работа с файлами


Модули

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

В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовке: и доступные пользователям в теле основной программы. Раздел «реализация» со­держит тела процедур и функций, перечисленных в интерфейсной части модуля Раздел «инициализация» содержит операторы, необходимые для инициализации модуля. Таким образом, модуль – это набор констант, типов данных, перемен­ных, процедур и функций. Каждый модуль компилируется отдельно; результат ком­пиляции – файл с расширением .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 практически означает вывод на печать}.