Типизированные файлы состоят из компонентов определенного типа и предназначены для хранения больших массивов однотипных данных. Типизированные файлы являются файлами прямого доступа, т. е. возможно обращение к произвольному компоненту, т. к. длина любого компонента строго постоянна.
2. Описание файловых переменных для типизированных файлов.
Файловая переменная, обозначающая типизированный файл, описывается следующим образом:
Var
<имя_файловой_переменной> : File of <тип_компонентов>;
где <тип_компонентов> - любой стандартный тип, определенный в Pascal (кроме файлового) либо тип, определенный пользователем в разделе Type (кроме файлового).
Пример.
Type Stroka=Srtring[15];
Var
F1 : File of Integer; {файл с целочисленными компонентами}
F2 : File of Stroka; {файл со строковыми компонентами}
3. Процедуры и функции работы с типизированными файлами.
а) К типизированным файлам применимы процедуры Assign, Reset, Rewrite, Close, Rename, Erase и функция Eof.
б) Функция FileSize.
Назначение:
определение числа компонентов (размера файла).
Синтаксис:
FileSize( F ), где F – файловая переменная.
Описание работы:
- функция FileSize возвращает целое число в диапазоне от 0 до 231-1, которое равно количеству компонентов в файле;
- если файл пуст, то функция возвратит 0.
Примечание:
- аргументом функции не может быть файловая переменная текстового файла;
- файл должен быть открыт до применения функции.
в) Функция FilePos.
Назначение:
определение текущей позиции указателя обработки.
Синтаксис:
FilePos( F ), где F – файловая переменная.
Описание работы:
- функция FilePos возвращает целое число в диапазоне от 0 до 231-1, которое равно текущей позиции (или номеру компонента, на который установлен указатель);
- если текущая позиция соответствует началу файла, то функция возвратит 0;
- если текущая позиция соответствует концу файла, то FilePos( F ) =
= FileSize( F ).
Примечание:
- аргументом функции не может переменная текстового файла;
- файл должен быть открыт до вызова функции.
г) ПроцедураSeek.
Назначение:
непосредственный доступ к заданному компоненту файла прямого доступа.
Синтаксис:
Seek( F, N ), где F – файловая переменная, N – номер нужного компонента, представляет собой целое число в диапазоне от 0 до 231-1.
Описание работы:
- процедура Seek перемещает текущий указатель к компоненту с номером N (первый компонент в файле имеет номер 0);
- для расширения файла предусмотрена возможность перемещения на конец файла, это осуществляется с помощью функции FileSize:
Seek(F, FileSize(F)).
Примечание:
- процедуру Seek нельзя использовать для текстовых файлов;
- файл должен быть открыт до вызова этой процедуры.
д) ПроцедураTruncate.
Назначение:
усечение файла
Синтаксис:
Truncate( F ), где F – файловая переменная.
Описание работы:
процедура Truncate отсекает часть файла от текущего положения указателя до конца, при этом текущая позиция файла становится концом файла.
Примечание:
- процедура Truncate не может применяться к текстовым файлам;
- файл должен быть открыт до вызова процедуры.
Задача 1. Создать файл Lab.dat из 20 целых чисел.
Program Dat;Uses Crt;Var F : File of Iinteger; i, j: Integer;BeginAssign(F, ‘Lab.dat’);{$I-}Rewrite(F); {$I+}If Ioresult <>0Then BeginWriteln (‘Нет места на диске’);Halt;End;Randomize; For i:=1 to 20Do Beginj:=Random(100);Write(F, j);End;Close(F);End.
{файловая переменная}{рабочие переменные}{установление связи F с внешним файлом}{отключение контроля ошибок ввода/вывода}{открытие файла для записи}{включение контроля ошибок ввода/вывода}{если Ioresult ¹ 0}{то вывод «На диске нет места»}{ и окончание работы программы}{формирование типизированного файла}{закрытие файла}
Связь между файловой переменной и внешним файлом устанавливается процедурой Assign. Открытие файла для записи осуществляется процедурой Rewrite. Если на диске нет места, то на экране появляется соответствующее сообщение и файл не создается. При наличии места на диске с помощью оператора For создается файл из 20 целых чисел. При этом каждый раз используется генератор случайных чисел, который инициализируется процедурой Randomize. Запись в файл производится через переменную j, т. к. с помощью процедуры Write (Writeln) в типизированный файл можно записать только значение переменной, выражения в этом случае использовать нельзя.
Задача
Заменить нулем все компоненты с нечетными номерами файла Lab.dat, созданного с помощью программы Dat.
Program Prim;Uses Crt;Var F: File of Iinteger;Name: String;Size, i, II, j: Integer;Procedure Wywod;BeginWhile not Eof(F)Do BeginRead(F, J);Write(J, ‘ ’);End;Writeln;End;BeginRepeatWrite(‘Входной файл >’);Readln(Name); Assign(F, Name); {$I-}Reset(F); {$I+}II:= Ioresult;If II<>0Then Writeln(‘Файл’,Name,’ не найден’);Until II=0;Wywod;Writeln(‘Для продолжения нажать Enter’);Readln;Size:=FileSize(F); For i:=1 to (Size div 2)Do BeginSeek(F, 2*i - 1);j:=0;Write(F, j);End;Writeln(‘Результирующий файл’);Seek(F, 0); Wywod;Close(F);Readln;End.
{файловая переменная}{имя файла}{рабочие переменные}{процедура вывода файла на экран}{в цикле}{ввод имени файла Lab.dat}{установление связь F с внешним файлом}{отключение контроля ошибок ввода/вывода}{открытие файла для чтения для записи}{включение контроля ошибок ввода/вывода}{присваивание II значения Ioresult}{если II ¹ 0}{то вывод сообщения «Файл…не найден»}{постусловие: пока не открыт нужный файл}{вывод исходного файла}{Size = число компонентов в файле}{в цикле по i}{перемещение указателя к следующему}{нечетному компоненту}{замена нулем нечетного компонента}{конец цикла For}{перемещение указателя в начало файла}{вывод полученного файла}{закрытие файла}
Объяснить (!!!). Открытие файла для чтения осуществляется стандартной процедурой Reset. С помощью процедуры Reset можно также открыть файл для его корректировки. Значение стандартной функции Ioresult присваивается рабочей переменной II, так как после повторного обращения к функции Ioresult (после вывода сообщения «Файл не найден») ее значение меняется, т. к. вывод на экран всегда корректен. Если открывается несуществующий файл на диске, то на экране появится сообщение «Файл … не найден» и снова будет запрашиваться имя входного файла. В данном примере надо ввести имя файла Lab.dat. С помощью стандартной функции Filesize определяется число компонентов в файле. Для перемещения указателя обработки к заданному компоненту используется процедура Seek. При определения длины файла оператором
Size:=Filesize(F);
и организации доступа к компонентам файла с помощью операторов вызова процедуры Seek
Seek(F, 2*I-1) (Seek(F, 0))
используются переменная Size типа Integer и выражение 2*i - 1 типа Integer. Для вывода на экран результирующего файла текущую позицию в файле надо переместить в начало. Для этого применяется процедура
Seek(F, 0);
Внутренняя процедура Wywod используется для вывода исходного и результирующего файлов.