10.1 Определение и описание файла
Файл представляет собой последовательность однотипных компонент произвольной длины. Каждый файл имеет свое имя, являющееся именем соответствующей файловой переменной, которая должна быть заявлена либо с помощью слова TYPE, либо - VAR. Для обозначения этого типа данных используется служебное слово FILE:
ПРИМЕР: a) type AZMORZE = (TOCHKA, TIRE);
MESSAGE = file of AZMORZE;
var TELEGRAM: MESSAGE;
б) var PISMO: file of char;
F: file of integer.
Здесь тип компонент может быть любым, кроме файлового типа.
Итак, в последнем примере определена F - переменная файлового типа. Это означает, что на ленте могут быть записаны только целые числа. Обратите внимание, что здесь никак не упоминается точное число элементов, которые можно записать в файл. Это можно делать постоянно, хотя в реальности лента, т.е. объем памяти, отведенной под запись файла, когда-то кончится (есть предел!!!).
10.2 Типы файлов. Процедуры работы с файлами
По своей связи с работающей программой файлы бывают внутренними и внешними.
ВНЕШНИЕ - это файлы, имена которых включены в список заголовка программы, и которые существуют вне программы, т.е. находятся на внешних носителях (дисках). Такие файлы заполнены заранее, записаны на дискету и могут быть использованы различными программами. Как уже сказано выше, их имена должны быть объявлены в заголовке программы: program OBRABOTKA (...,MESSAGE,PISMO,...).
ВНУТРЕННИЕ - это файлы, имена которых не внесены в заголовок программы. Они существуют только во время исполнения программы. Работа с ними идет одинаково, только внутренний файл пропадает после окончания работы программы.
Мы знаем, что каждый тип Паскаля имеет свой набор операций, определенный типом компонент этого объекта. Для внутренних файлов, рассматриваемых как единое целое, никаких операций нет – ни сравнения файлов, ни операции присваивания. Можно работать только с отдельными компонентами, и эта работа зависит от типа компонент файла. Для доступа к отдельным компонентам файла в Паскале введены стандартные процедуры RESET, GET, REWRITE, PUT и функции EOLN и EOF.
Обращение к ним идет с помощью процедур-операторов. Все эти процедуры тем или иным образом связаны с установкой режима работы с заданными файлами (чтение или запись). При этом происходит следующее:
ЧТЕНИЕ - присваивание переменной значения компоненты файла;
ЗАПИСЬ - запись значения переменной в конец файла.
Для удобства описания этих действий введено понятие "окно файла" или просто "окно". Окно определяет позицию доступа, т.е. компоненту файла, которая доступна для чтения (в режиме чтения), для записи (в режиме записи). Последняя позиция файла помечается специальным образом, что определяет конец файла.
Для работы с файлами в режиме чтения и записи используются операторы REWRITE, WRITE, RESET, READ и EOF. Рассмотрим их синтаксис и назначение.
REWRITE(F)- установка в начальное положение режима записи.
F | |||||
^ | |||||
окно |
WRITE(F,X) - записывает в файл F (где сейчас стоит окно) очередную компоненту, равную значению выражения X, после чего окно сдвигается вправо на следующую позицию файла:
F | F1 | F2 | F3 | ® | F1 | F2 | F3 | X | … | ||
^ | ^ | ||||||||||
окно | окно |
RESET(F) - перевод в режим чтения и установка окна на первую позицию файла.
F | |||||
^ | |||||
окно |
READ(F,V) - переменной V присваивается значение текущей позиции файла F, и окно перемещается на следующую позицию.
F | F1 | F2 | F3 | F4 | … | ® | F | F1 | F2 | F3 | F4 | … |
^ | ^ | |||||||||||
окно | окно |
ПРИМЕЧАНИЕ. Файл открывается либо только для записи, либо для чтения - одновременно это делать нельзя!!!
При работе с файлами необходимо знать конец файла. Это делает логическая функция EOF:
EOF(F) = FАLSE, если конец файла не достигнут;
EOF(F) = TRUE - признак конца файла.
Функция EOF неразрывно связана с окном файла, которое всегда "смотрит" на одну из компонент файла. Эта функция всегда имеет определенное значение в зависимости от местонахождения окна файла. При заполнении файла последняя ее компонента всегда снабжается признаком конца. Пустой файл имеет единственную компоненту, содержащую признак конца файла.
ПРИМЕР 1. Расшифровка текста
Пусть все буквы от A до Z имеют коды от 65 до 90. Имеется файл SHIFRTEXT, состоящий из чисел от 65 до 90. Напечатать расшифрованный текст:
program RASSHIFROVKA (SHFRTXT);¦ program KODIROVKA;
type KOD = 65..90; ¦ type KOD = 65..90;
LITERA = 'A'..'Z'; ¦ SHIFR = file of KOD;
SHIFR = file of KOD; ¦ var x: KOD;
var x: KOD; ¦ SH: SHIFR;
y: LITERA; ¦ begin
SH: SHIFR; ¦ ¦ assign(SH,'shfrtxt');
begin ¦ ¦ rewrite (SH);
¦ assign(sh,'shfrtxt'); ¦ ¦ read(x);
¦ reset(SH); ¦ ¦ while x<> 00 do begin
¦ while not eof(SH) do¦ ¦ ¦ write (SH,x);
¦begin ¦ ¦ ¦
¦ ¦ read(SH,x); ¦ ¦ ¦ read(x);
¦ ¦ y:=chr(x); ¦ ¦ end;
¦ ¦ write(y); ¦ ¦ close(SH);
¦ end; close(sh); ¦ end.
end.
ПОЯСНЕНИЕ. В рассмотренном примере программа RASSHIFROVKA производит расшифровку строки числовых кодов файла SHFRTXT, сформированного с помощью программы KODIROVKA. В программе KODIROVKA предусмотрен непрерывный ввод кодов - двухзначных чисел от 65 до 90, разделяемых пробелом. Признаком конца ввода является код 00.
В обеих программах фигурируют операторы ASSIGN и CLOSE, о назначении которых речь пойдет в следующем пункте.
10.3 Буферная переменная
Мы знаем, что для чтения компоненты файла используется процедура READ(F,V). По этой процедуре выполняются два действия:
1. Копирование компоненты файла F, на которую смотрит окно, и присваивание этого значения переменной V.
2. Перемещение окна на следующую компоненту.
Однако, иногда удобно эти два действия разделить. Для этого вводится понятие буферной переменной. Она имеет имя: F^. Эту переменную не надо описывать, она определяется автоматически, как только описывается файл F. Тип F^ совпадает с типом компоненты файла. С переменной F^ можно выполнять все действия, как над данными типа компонент файла.
Если выполнена процедура RESET(F), то происходит установка окна на первую компоненту и значение этой компоненты идет в F^:
F | X | F^ | ||||||
^ | ||||||||
окно |
Если выполнен RESET(F), а файл F пуст, т.е. EOF(F)=TRUE, то значение F^ неопределенно. Окно файла указывает на его конец. Для передвижения окна файла и заполнения (чтения) буферной переменной используются в некоторых версиях Паскаля специальные процедуры-операторы GET и PUT:
а) GET(F) - передвижение окна на следующую компоненту и засылка значения этой компоненты в переменную F^.
F^ | 7 | f | 3 | 5 | 7 | 8 | ||
^ | ||||||||
окно |
после GET(F):
F^ | 8 | f | 3 | 5 | 7 | 8 | ||
^ | ||||||||
окно |
б) PUT(F) - запись в файл значения F^ и сдвиг вправо. Здесь до PUT(F) надо F^ присвоить очередное значение. В режиме записи значений в файл F^ служит поставщиком значений компонент. После процедуры REWRITE(F) окно устанавливается на первую компоненту, значение F^ не определено. Затем надо определить значение F^ с помощью команды присваивания: F^:=3. Если теперь написать процедуру PUT(F), то значение F^ идет в компоненту, где стоит окно, после чего значение F^ становится неопределенным:
F^ | 3 | f | 6 | 4 | 7 | 8 | |||
^ | |||||||||
окно |
PUT(F)
F^ | f | 6 | 4 | 7 | 8 | 3 | ||||
^ | ||||||||||
окно |
ПРИМЕР 2. Запись чисел v1 - v5 в файл BUFFER и последующий их вывод на печать
program KVADRKOREN;
var R: real; I: integer; BUFFER: file of real;
begin
¦ rewrite(BUFFER);
¦ for I:=1 to 5 do
¦ begin
¦ ¦ BUFFER^:=sqrt(I); put(BUFFER);
¦ end;
¦ reset(BUFFER);
¦ for I:=1 to 5 do
¦ begin
¦ ¦ R:=BUFFER^;
¦ ¦ get(BUFFER); writeln(R);
¦ end;
end.
ЗАМЕЧАНИЕ. В некоторых версиях процедуры GET и PUT не существуют (в частности, это имеет место для Турбо-Паскаля). Но без них можно обойтись, т.к. существуют эквивалентные им операторы READ и WRITE. Им эквивалентны следующие составные операторы:
READ(F,V) => BEGIN V:=F^; GET(F) END;
WRITE(S,W) => BEGIN S^:=W; PUT(S) END.
... .....-46.780 Program Prim24; Var r1,r2:real; BEGIN r1:=-46.78; r2:=-46.78; writeln('r1=',r1:12:3,' r2=',r2:9:4); writeln('_______________________________'); readln; END. 6. Массивы 6. 1. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...
0 комментариев