ИТ / М 3 Офісні програмні системи / Файлы ПЗ-08 / Неформатированный текст
.doc10. Файлы
10.1. Основы работы с файлами
10.1.1. Физические файлы и файловые переменные
Под файлом обычно понимают именованную область на внешнем носителе информации.
Каждый файл, будучи областью на внешнем носителе информации, является последовательностью байтов. Одну и ту же последовательность байтов можно рассматривать и обрабатывать как последовательность либо значений некоторого типа, либо символов с разбиением на строки, либо байтов.
В Паскаль-программе файл задается именем файловой переменной, т.е. она служит представителем файла в программе. Тип в ее определении задает способ, по которому обрабатывается файл. Далее области на внешних носителях называются физическими файлами, а под словом "файл" понимается именно файловая переменная. В языке Паскаль есть три основных вида файлов: типизированные, текстовые и бестиповые.
Типизированный файл — это последовательность переменных некоторого скалярного или структурного (но не файлового) типа. Тип задается выражением вида file of тип. Вот примеры.
type flchar = file of char;
type Student = record
Name: String;
Number: Integer;
end;
flStud = file of Student;
var Fi, Fo: flStud;
FF: flchar;
Примечание.
Текст обычно понимается как последовательность символов, разбитая на строки. В языке Паскаль для файлов-текстов определен специальный тип с именем text.
Элементами текста являются символы, однако тип text отличается от типа file of char. В текстах есть специальные символы, которые задают концы строк и конец текста. Тексты обрабатываются с помощью специальных подпрограмм, неприменимых к типизированным файлам, например, readln и writeln.
Бестиповые файлы рассматриваются как последовательности байтов и определяются с помощью служебного слова file. Например,
var Fi, Fo: file;
Для них также определены специфические подпрограммы.
Элементы массивов и записей могут иметь файловые типы. Например, допустимы следующие определения типов.
type Arrfil = array [1..2] of file of Student;
type Rcrfil = record
data: text;
temp: char
end;
Описанные выше три вида файлов отличаются не возможным содержанием, а наборами подпрограмм, применимых к ним.
Практически у всех подпрограмм первым параметром является имя файловой переменной. Пусть далее имя f обозначает файловую переменную (хотя в реальных программах лучше давать файловым переменным содержательные имена, например, workfile, inputfile и т.п.).
Работа с файловой переменной начинается со связывания ее с конкретным физическим файлом. Для этого идентификатор файловой переменной и имя физического файла в операционной системе, или внешнее имя, задаются в вызове процедуры assign, например, assign(f, 'myfile.dat'). Второй аргумент, т.е. внешнее имя — это выражение строчного типа. Например, если строки sl и s2 имеют значения 'c:\mydir\book' и 'txt', то assign(f, sl+'.'+s2) связывает файловую переменную f с файлом c:\mydir\book.txt. После вызова процедуры assign физический файл можно обозначать именем файловой переменной.
Если нужно связать f с файлом, внешнее имя которого "default.dat", достаточно нажать на клавишу <Entet>. Для другого связывания нужно набрать на клавиатуре внешнее имя, например, "newname.dat", и нажать <Enter>.
Имена input и output можно не записывать в вызовах подпрограмм обработки файлов. Именно так вызовы readln и writeln выглядели в предыдущих главах.
Работать с элементами связанного файла можно только после его открытия. Оно задается процедурами, которые рассматриваются ниже. Однако сейчас опишем закрытие файла с помощью процедуры close. Ee вызов имеет такой вид.
close(f);
Она не разрывает связи имени f с физическим файлом, но чтение и запись с помощью этого имени невозможны до следующего открытия или нового связывания с дальнейшим открытием.
Попытка закрыть уже закрытую или еще не открытую файловую переменную приводит к аварийному завершению программы.
Таким образом, стандартный порядок действий с файловой переменной можно представить в следующем виде.
связывание
открытие
обработка
закрытие
новое открытие или связывание и открытие
обработка
закрытие
и т.д.
10.1.2. Последовательная запись в типизированные файлы
Файл, предназначенный для записи, следует открыть с помошью процедуры rewrite. После вызова ReWrite(f) значение f можно представить как (<>, 0, W), т.е. независимо от предыдущего состояния f последовательность в файле становится пустой (см. рис. 10.2, б).
Примечание
Эта процедура вызывается для создания нового физического файла или обновления старого с уничтожением предыдущих данных. После ее выполнения файл называется установленным в начальное состояние для записи.
Запись в файл задается процедурой write. При выполнении ее вызова
write(f, выражение_типа_компонентов_файла);
значение выражения вычисляется и присваивается доступному элементу файла, после чего указатель доступного элемента сдвигается на 1 элемент. Например, рассмотрим следующую программу.
program ...
var f: file of integer;
x: integer;
begin
rewrite(f); x:=2;
write(f, 1); write(f, x); write(f, x*x);
end.
В вызове write допустимо произвольное число аргументов соответствующего типа:
write(f, выражение_1, ... , выражение_n);
Такой вызов выполняется на самом деле как последовательность
write(f, выражение_1); ... ; write(f, выражение_n);
К типизированным файлам неприменима процедура writeln. Она определена только для текстов.