Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
80
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Особенности обработки типизированных файлов.

Файл с типом (типизированный файл) состоит из последовательности записей одинаковой длины и одинакового внутреннего формата. Записи следуют непрерывно друг за другом. Первые 4 байта первого сектора файла содержат количество и длину записи. К файлам с такой организацией можно обращаться последовательно и выборочно (с прямым доступом).

При последовательном доступе записи располагаются на внешнем носителе последовательно в порядке их поступления, т.е. чтение или запись I+1 компоненты возможно только послеI–ой компоненты.

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

Общий вид описания типизированного файла:

TYPE < идентификатор типа >= FILE OF < тип компонент >;

Например,

  1. TYPE T = FILE OF REAL;

VAR F: T;

  1. VAR F: FILE OF REAL;

  1. TYPE ST= RECORD

A: STRING[10];

B: INTEGER;

C: REAL;

D: BYTE

END;

VAR DAN: FILE OF ST;

В первом варианте тип файла описан в разделе описания типов, а затем в разделе описания переменных файловая переменная получает этот тип, во втором варианте тип предварительно не описывается. В третьем варианте предварительно описывается тип записи файла, а в разделе описания переменных этот тип используется для указания типа отдельной записи.

Процедуры чтения и записи для файлов с типом READиWRITE. Кроме того, используются процедуры и функцииASSIGN, RESET, REWRITE, SEEK, CLOSE,FILEPOS, FILESIZE, EOF. ПроцедураTRUNCATE обрезает файл на заданной файловой позиции.

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

Структура записи файла следующая:

  • фамилия;

  • табельный номер;

  • заработная плата.

type tz=record

fio:string[10];

tn:integer;

zp:real

end;

var zap:tz;

fout:file of tz;

fl:boolean;

name:string;

begin

repeat

writeln('имя файла ');

readln(name);

assign (fout,name);

{$i-} reset(fout); {$i+}

if ioresult=0 then

begin

writeln('файл ',name,' уже есть');

close(fout);

fl:=false

end

else

begin

rewrite(fout);

fl:=true

end

until fl;

with zap do

repeat

writeln('ввод fio,tn,zp');

readln(input,fio,tn,zp);

write(fout,zap);

until eof(input);

close(fout);

reset(fout);

with zap do

repeat

read(fout,zap);

writeln(fio:15,tn:9,zp:8:2);

until eof(fout);

close(fout)

end.

В начале программы выполняется ввод имени файла до тех пор, пока не будет введено имя несуществующего файла, т.к. в противном случае старый файл будет уничтожен и данные будут утеряны. После ввода нового имени флаг FL становится равным TRUE и цикл ввода имени файла прекращается. После этого начинается непосредственно цикл ввода данных с клавиатуры из файла INPUT . Признак конца ввода Ctrl+Z. Стандартное имя файла ввода с клавиатуры INPUT можно опустить и в операторе чтения из файла readln, и в функции проверки конца ввода eof. После создания файла и ввода всех данных файл закрывается процедурой close. Затем созданный файл открывается для чтения, данные из него читаются и выводятся на экран в виде таблицы.

Файл может расширяться путем включения последующих элементов за последним существующим элементом файла. Для этого используется процедура позиционирования:

SEEK(<имя файла>, FILESIZE(<имя файла>)).

В следующей программе, используя прямой доступ к записям файла, созданного в предыдущей программе, требуется подсчитать сумму зарплаты рабочих, чьи табельные номера вводятся с клавиатуры (предполагается, что при создании файла были использованы табельные номера в интервале 101-999 и запись с номером 101 занимает первое место в файле, за ней следует запись с табельным номером 102 и т.д.).

type tz=record

fio:string[10];

tn:integer;

zp:real

end;

var zap:tz;

fout:file of tz;

tn1,tn2,n:integer;

s:real;

name:string;

begin

writeln('имя файла ');

readln(name);

assign (fout,name);

reset(fout);

s:=0;

repeat

readln(tn2);

tn1:=tn2-101; {формирование указателя записи}

seek(fout,tn1);

read(fout,zap);

s:=s+zap.zp;

until eof;

writeln(‘s= ‘,s);

close(fout)

end.

В этой программе процесс обработки заканчивается, когда прекращается ввод табельных номеров, подлежащих обработке, т.е. Ctrl+Zдля файла ввода с клавиатуры.