Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ОАиП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.14 Mб
Скачать

Компонентные файлы

Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов file of.

var имя : file of тип_компонент;

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

type mas = array [1 .. 100] of real;

var a, b : mas;

f : file of mas;

begin

assign(f, 'some_file.dat'); rewrite(f);

...

write(f, a, b);

close(f)

end.

Обратите внимание, что компонентой этого файла является массив целиком. За одну операцию записывается или считывается столько компонент, сколько перечислено в процедурах write или read.

Компонентные файлы, как и бестиповые, применяются не для просмотра их человеком, а для использования в программах.

Прямой доступ

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

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

Ниже описаны стандартные подпрограммы для реализации прямого доступа.

filepos (var f) : longint

Функция возвращает текущую позицию в файле f. Для только что открытого файла это будет 0.

filesize (var f) : longint

Функция возвращает количество блоков в открытом файле f.

seek (var f; n: longint)

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

truncate (var f)

Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.

Пример. Программа, которая выводит на экран заданную по номеру запись из файла, сформированного в пример 3.6.

</em><code>program get_bfile;

var buf : array[1 .. 4] of real;

f : file;

i, k : integer;

filename : string;

begin

{$I–}

writeln('Введите имя входного файла'); readln(filename);

assign(f, filename);

reset(f, sizeof(real) * 4);

if IOResult <> 0 then begin

writeln('Файл ', filename, ' не найден'); exit end;

{$I+}

while true do begin

writeln('Введите номер записи или –1 для окончания');

readln(k);

if (k > filesize(f)) or (k < 0) then begin

writeln('Такой записи в файле нет',); exit end;

seek(f, k);

blockread(f, buf, 1);

for i:= 1 to 4 do write(buf[i]:6:1);

end;

close(f);

end.

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

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