2.2. Типизированные файлы
Типизированные файлы - это файлы, состоящие из нумерованной последовательности объектов (записей) любого типа. С такими файлами можно работать в режиме прямого доступа, при котором выполняется непосредственное обращение к любой записи файла. Каждая запись файла имеет свой номер, начиная с 0 и т.д.
Процедуры и функции обработки файлов:
Write и Read - записывают и читают информацию из указанного файла и перемещают указатель файла к следующей записи.
Seek(<файловая переменная>, <номер записи>); процедура перемещения указателя на запись файла с заданным номером .
Truncate(<файловая переменная>); процедура, усекающая файл по текущей позиции указателя файла, т.е. все записи, находящиеся после указателя файла, удаляются.
Функция Filesize(<файловая переменная>); имеет тип Integer и определяет размер файла, т.е. число записей.
Функция Filepos(<файловая переменная>); имеет тип Integer и возвращает текущую позицию указателя файла.
Для добавления записей в конец файла используются процедуры:
Readln (a );
Seek (f, filesize (f));
Write (f, a);
При этом указатель устанавливается за конец файла, т.к. нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только процедурой Reset(f).
Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вызова процедуры Seek. Один вызов перед операцией Read, а другой - перед операцией Write (т.к. Read после чтения записи переместит указатель к следующей записи).
Пример: Cоздать файл из списка 10 студентов с их оценками ( номер, Ф.И.О. и три оценки). Вывести его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры, заново прочитать файл.
Program lab6;
Type
wed = record {Тип wed включает 3 поля: n, fio, bal}
n : byte ;
fio : string[15] ;
bal : array [1..3] of byte; {Поле bal - массив из 3 оценок }
end;
Var spisok : wed ; {Запись spicok типа wed}
sp : file of wed; {Файл записей типа wed}
procedure vvod; { процедура создания файла}
var i, j : byte;
begin
{ оператор assing находится в основной прграмме }
rewrite ( sp); {открытие файла для записи}
with spisok do
For i:=1 to 10 do begin
n:=i;
writeln(' Введите фамилию - ',i ); readln(fio);
writeln(' Введите 3 оценки ' fio );
For j:= 1 to 3 do readln(bal[] );
write(sp, spisok); { запись в файл информации о студенте}
end;
close (sp); { закрытие файла для записи }
end;
procedure print; { процедура чтения и печати всего файла }
var j : byte;
begin
reset ( sp); {открытие файла для чтения}
writeln (' Список студентов: ');
while not eof (sp) do
with spisok do
begin
Read(sp, spisok); {чтение данных из файла}
write (n,' ',fio); {вывод записи на экран}
For j:=1 to 3 do write(' ',bal[j]);
writeln ;
end;
readln;
close (sp) ;
end;
procedure work;
var num: integer;
begin
reset ( sp); {открытие файла для чтения}
writeln ('номер= '); readln (num);
seek (sp, num-1); {поиск записи с указанным номером (нумерация записей с 0)}
read (sp,spisok);{чтение и перемещение указателя к след. записи}
write ('fio='); writeln (spisok.fio);
seek (sp,filepos(sp)-1); {возвращение к изменяемой записи }
writeln (' Введите новую фамилию'); readln (spisok.fio);
write (sp, spisok); {запись в файл измененной записи}
close (sp);
end;
begin {начало основной программы}
assign (sp,'Vedom.DAT'); {связать файловую перем-ю sp с файлом Vedom.dat}
vvod; print; {процедуры создания и чтения файла}
work; print; {корректировка и чтение измененного файла}
readln
end.
Достарыңызбен бөлісу: |