Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Paskal_uchebn_posob_chast2_26_6_7

.pdf
Скачиваний:
49
Добавлен:
09.04.2015
Размер:
670.28 Кб
Скачать

21

( По крайней мере в 2-х магазинах : A:=[]; for x:= хлеб to сыр do begin

m:=0;

for i:=1 to n do begin

if x in m1[i] then m:=m+1;

if ((m>1) and(m<3)) then a:=a+[x]; end;end; )

В программе AMAF в разделе типов задается список объектов (продуктов), определяющий базовый тип (Продукты), на котором определен множественный тип (АССОРТ). Информация о наличии продуктов во всех магазинах задается как массив множеств.

В начале программы вложенные циклы обеспечивают ввод входной информации. При этом во внутреннем цикле формируется множество ХМ1, характеризующее наличие товара в одном магазине. По выходе из внутреннего цикла эта информация заносится в массив М1. Затем строятся множества А,В,С с использованием операций над множествами (пересечение, объединение, вычитание). В конце программы вложенные циклы по i и x обеспечивают распечатку полученных множеств. При этом используется оператор CASE.

PDF created with pdfFactory Pro trial version www.pdffactory.com

22

ЛЕКЦИЯ 16. ФАЙЛЫ

Под файлом понимается либо именованная область внешней памяти

ПК (жесткого диска,

гибкой

дискеты, электронного

"виртуального"

диска), либо логическое устройство -

потенциальный

источник или

приемник информации.

 

 

 

 

 

 

 

Любой файл имеет три характерные особенности.

 

 

Во-первых, у него есть

 

имя, что дает возможность программе

работать одновреенно с несколькими файлами.

 

 

 

Во-вторых, он

содержит

комроненты

одного

типа.

Типом

компонентов может быть любой тип

Турбо Паскаля,

кроме

файлов.

Иными словами, нельзя создать "файл файлов".

 

 

 

В-третьих, длина вновь создоваемого файла никак не оговаривается

при его объявлении и ограничивается

только

емкостью устройств

внешней памяти.

 

 

 

 

 

 

 

Файловый тип или переменную файлового типа можно задать одним

из трех способов:

 

 

 

 

 

 

 

<имя>=FILE OF<тип>;

{типизированный}

 

<имя>=TEXT;

 

 

{текстовый}

 

 

<имя>=FILE;

 

 

{нетипизированный}

 

Здесь <имя>-има файлового типа (правильный идентификатор); FILE,OF- зарезервированные слова (файл,из); TEXT- имя

стандартного типа текстовых файлов; <тип> - любой тип Турбо Паскаля,кроме файлов.

Например:

type

produсt = record name : string; code : word; cost : comp end;

text80=file of string[80]; var

f1: file of char; f2: text;

f3: file; f4: text80;

f5: file of produсt;

PDF created with pdfFactory Pro trial version www.pdffactory.com

23

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

файлов:

*типизированные файлы (задаются предложением FILE,OF...);

*текстовые файлы (определяются типом TEXT);

*нетипизированные файлы (определяются типом FILE).

Внаших примерах F1, F4 и F5- типизированные файлы, F2 текстовый файл, F3- нетипизированный файл. Вид файла, вообще говоря, определяет способ хранения информации в файле. Однако в Турбо Паскале нет средств контроля вида ранее созданных файлов.

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

Доступ к файлам.

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

PROGRAM NameOfProgram(input , output);

В Турбо Паскале это необязательно, вот почему заголовок программы можно опускать.

Любые другие файлы , а также логические устройства становятся

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

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

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

ASSIGN(<ф.п.>,<имя файла или л.у.>);

Здесь <ф.п.>- файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);

<имя файла или л.у.>-текстовое выражение,содержащее имя файла или логическое устройство. Если имя файла задается в виде пустой строки, например, ASSIGN(f,"), то в зависимости от направления обмена

PDF created with pdfFactory Pro trial version www.pdffactory.com

24

данными файловая переменная связывается со стандартным файлом

INPUT или OUTPUT.

Имена файлов.

Имя файла -это любое выражение строкового типа, которое строится по правилам определения имен в MS DOS (операционной системе ПК):

*имя содержит до восьми разрешенных символов; разрешенные символы- это прописные и строчные латинские буквы, цифры и символы:

!@ # $ % ^ & ( ) ` ~ - _

*имя начинается с любого разрешенного символа;

*за именем может следовать расширение -последовательность до трех разрешенных символов; расширение, если оно есть, отделяется от имени точкой.

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

Имя диска- это один из символов A...Z, после которого ставится двоеточие. Имена А: и В: относятся к дисковым накопителям на гибких дискетах, имена C:, D: и т.д.- к жестким дискам. Эти имена могут

относится

также

к одному

или нескольким виртуальным

дискам,

созданным

в оперативной памяти ПК специальной командой VDISK в

ходе выполнения

файла

автоустановки параметров

дисковой

операционной системы (ДОС) CONFIG.SYS.

 

Если

имя диска не

указано подразумевается устройство по

умолчанию - то, которое было установлено в операционной системе перед началом работы программы.

За именем диска может указываться имя каталога, содержащего файл. Если имени каталога предшествует обратная косая черта, то путь к файлу начинается из корневого каталога, если черты нет - из текущего каталога, установленного в системе по умолчанию. За именем каталога может следовать одно или несколько имен каталогов нижнего уровня. Каждому из них должна предшествовать обратная косая черта. Весь путь к файлу отделяется от имени файла обратной косой чертой. Максимальная длина имени вместе с путем79 символов, например:

var

finp : text;

fout : file of string; const

name='c:\dir\subdir\out.txt';

......

PDF created with pdfFactory Pro trial version www.pdffactory.com

25

assign(finp,'123.dat');

assign(fout,name);

Логические устройства.

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

рассматриваются как потенциальные источники или приемники текстовой информации.

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

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

ввода обеспечивает возможность редактирования вводимой строки стандартными средствами ДОС. При вводе символов осуществляется их эхо-повтор на экране ПК. В Турбо Паскале можно прочитать любой символ клавиатуры, в том числе и символ CR, вырабатываемый клавишей "Ввод", сразу после нажатия на соответствующую клавишу без эхо-повтора.

PRN- логическое имя принтера. Если к ПК подключено несколько принтеров, доступ к ним осуществлается по логическим именам LPT1, LPT2 и LPT3. Имена PRN и LPT1 первоначально-синонимы. Средствами ДОС можно присвоить имя PRN любому другому логическому устройству, способному принимать информацию.

Стандартный библиотечный модуль PRINTER, входящий в библиотеку TURBO.TRL, объявляет имя файловой переменной LST и связывет его с логическим устройством LPT1. Это дает возвможность использовать простое обращение к принтеру. Например, программа

Uses Printer;

Begin

writeln(LST, 'Привет, мир!')

PDF created with pdfFactory Pro trial version www.pdffactory.com

26

End.

выведет на принтер фразу "Привет, мир!", а все необходимые операции

по открытию логического устройства выполнит библиотечный блок

PRINTER.

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

программе в каждый момент времени ему можно назначить только одну из этих функций. Как правило, в составе ПК имеются два коммуникационных канала, которым даются имена логических устройств COM1 и COM2. Первоночально имена AUX и COM1- синонимы.

NUL- логическое имя "пустого" устройства. Это устройство чаще

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

Связывание логического устройства с файловой переменной осуществляется процедурой ASSIGN, например:

var

f1,f0 :text;

.......

assign(f1, 'AUX'); assign(f0,'LRT2');

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

Инициализация файла

 

Инициализировать файл означает указать для этого

файла

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

PDF created with pdfFactory Pro trial version www.pdffactory.com

27

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

RESET (<ф.п.>);

<ф.п.>-файловая переменная, связанная ранее процедурой ASSIGN с уже существующим файлом или логическим устройством-приемником

информации.

 

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

логическое

устройство подготавливается к чтению информации. В

результате

специальная переменная-указатель, связанная с этим файлом, будет

указывать на начало файла,

т.е. на компонент с порядковым номером 0.

Если дается

попытка

инициировать чтение из несуществующего

файла или из логического устройства PRN,возникает ошибка периода

исполнения,которая

может быть сообщена программе ненулевым

значением встроенной функции IORESULT типа WORD. Например,

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

var

f:file of char;

...........

assign(f, 'myfile.dat');

{$I-} { Отключить контроль ошибок ввода-вывода }

reset(t);

 

{$I+}

{ Включить конроль ошибок ввода-вывода }

if IoResult <> 0 then

 

....

{ Файл не существует

}

else

 

 

....

{ Файл существует

}

Вэтом фрагменте с помощью директивы компилятора {$I-} отключается автоматический контроль ошибок ввода-вывода. Если этого не сделать, то отсутствие файла приведет к аварийному завершению программы.

ВТурбо Паскале разрешается обращатся к типизированным файлам, открытым процедурой RESET (т.е. для чтения информации), с помощью процедуры WRITE (т.е. для записи информации). Такая

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

или WRITELN.

PDF created with pdfFactory Pro trial version www.pdffactory.com

28

Стандартная процедура REWRITE(<ф.п.>) инициирует запись информации в файл или в логическое устройство, связанное ранее с файловой переменной <ф.п.>.Процедурой REWRITE нельзя инициировать запись информации в ранее существующий дисковой файл:

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

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

0.

Стандартная процедура APPEND(<ф.п.>) инициирует запись в ранее существовавшой текстовый файл для его расширения, при этом указатель файла устанавливается в конец. Процедура APPEND применима только к текстовым файлам, т.е. их файловая переменная должна иметь тип TEXT (см. выше).Процедурой APPEND нельзя инициировать запись в типизипованный или нетипизированный файл. Если текстовый файл ранее уже был открыт с помощью RESET или REWRUTE, использование процедуры APPEND проведет к закрытию этого файла и открытию вновь, но уже для добавления записей.

PDF created with pdfFactory Pro trial version www.pdffactory.com

29

ЛЕКЦИЯ 17. Процедуры и функции для работы с файлами.

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

Процедура CLOSE.

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

CLOSE(<ф.п.>)

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

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

Процедура RENAME.

Переименовывает файл. Формат сообщения:

RENAME(<ф.п.>,<новое имя>);

Здесь <новое имя>-строковое выражение, содержащее новое имя файла. Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

Процедура ERASE.

Уничтожает файл. Формат обращения:

ERASE (<ф.п.>)

PDF created with pdfFactory Pro trial version www.pdffactory.com

30

 

 

 

 

 

 

 

 

 

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

если он

ранее был открыт процедурами RESET, PEWRITE или APPEND.

 

 

 

 

Следующий фрагмент программы показывает,

как

можно

использовать процедуры RENAME и CLOSE при работе с файлами.

Предположим, что требуется отредактировать файл,

имя

которого

содержит переменная NAME. Перед редактированием необходимо

убедится, что нужный файл имеется на диске, и

переименовать

егозаменить расширение этого файла на .BAK (страховочная копия). Если файл с таким расширением уже существует, его надо стереть.

var

 

 

fi:text;

 

 

fo:text;

 

 

name : string;

{ Исходный файл

}

name_bak : string;

{ Отредактированный файл }

k,i :word;

 

 

const

 

 

bak ='.bak';

 

 

........

 

 

{ Получить в name_bak имя файла с расширением .BAK: }

k:=pos('.',name);

 

 

 

 

 

if

k=0 then

k:=lengt(name)+1;

 

 

name_bak:=copy(name,1,k-1)+bak;

 

 

{ Проверить существование исходного файла:

}

assign (fi,name);

 

 

 

 

 

{$I-}

 

 

 

 

 

reset(fi);

 

 

 

 

 

if IoResult <> 0 then halt;

{ Файл не существует

}

сlose (fi);

 

 

 

 

 

{ Проверить

существование

BAK-файла

}

assign(fo,name_bak);

 

 

 

 

{$I+}

 

 

 

 

 

if IoResuit = 0 then

 

 

 

 

 

begin

{ Файл .BAK существует: }

 

 

close(fo);

 

 

 

 

erase (fo);

 

 

 

 

end;

 

 

 

 

 

{

Проверки закончены,

подготовка к работе :

}

rename (fi,name_bak); reset (fi);

assign (fo,name); rewrite(fo);

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]