Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0043234_0ADD1_ayap.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
682.5 Кб
Скачать

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

Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов 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.

Пример #2.

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

program tip_file;

type

Complex = record

d, m : real;

end;

var x : Complex;

f1 : text;

f2 : file of Complex;

i : byte;

begin

assign(f1, 'tipfile.dat'); reset(f1);

assign(f2, 'tipfile.res'); rewrite(f2);

while not eof(f1) do begin

read(f1, x.d, x.m); write(f2, x);

end;

close(f1); close(f2);

end.

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

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

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

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

filepos(var f) : longint

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

filesize(var f) : longint

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

seek(var f; n: longint)

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

truncate(var f)

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

Пример #3.

Программа, которая выводит на экран заданную по номеру запись из файла, сформированного в программе create_bfile (с. ???$Rcrbfile).

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.

Подпрограммы

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

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

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

Само по себе описание не приводит к выполнению подпрограммы. Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов записывается в том месте программы, где требуется получить результаты работы подпрограммы. Подпрограмма вызывается по имени, за которым следует список аргументов в круглых скобках. Если аргументов нет, скобки не нужны. Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу.

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

inc(i); writeln(a, b, c); { вызовы процедур }

y := sin(x) + 1; { вызов функции }

Внутри подпрограмм можно описывать другие подпрограммы. Они доступны только из той подпрограммы, в которой они описаны. Рассмотрим правила описания подпрограмм.