Программа на Delphi

Перемещает указатель на запись с номером N. Первая запись имеет порядковый номер 0.

  1. Function FilePos( f: File of Type): LongInt;

Возвращает номер записи, на которую установлен указатель.

  1. Procedure CloseFile( f: File of Type);

Закрывает файл.

  1. Function Eof(f: File of Type): boolean;

Возвращает True, если достигнут конец файла.

  1. Function FileSize(f: File of Type): LongInt;

Возвращает количество записей в файле. Например, Seek(f, FileSize(f)) установит указатель в конец файла (после последней записи).

  1. Procedure Truncate(f: File of Type);

Уничтожает (отрубает) конец файла начиная с записи, на которую установлен указатель.

17.4. Файлы без типа

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

Файловая переменная может быть объявлена так:

Var F: File;

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

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

17.4.1. Процедуры и функции для работы с файлом без типа

  1. Procedure AssignFile( f: File; FileName: String);

Связывает файловую переменную f с дисковым файлом FileName.

  1. Procedure Rewrite( f: File);

Создает новый файл и открывает его. Если файл существует, то он уничтожается и создается как новый.

  1. Procedure Reset( f: File[; Size: Word]);

Открывает существующий файл и устанавливает указатель на первую запись. При отсутствии файла возникает ошибка ввода/вывода. Параметр Size указывает размер записи открываемого файла. При его отсутствии размер записи по умолчанию равен 1.

  1. Procedure BlockRead( f: File; Var Buf; Count: Word[; Var Result: Word]);

Читает из файла Count записей в переменную Buf. Result – реально прочитанное количество записей.

  1. Procedure BlockWrite( f: File; Var Buf; Count: Word[; Var Result: Word]);

Пишет в файл первых Count записей из переменной Buf. Result – реально записанное количество записей.

  1. Procedure Seek( f: File; N: LongInt);

Перемещает указатель на запись с номером N. Первая запись имеет порядковый номер 0.

  1. Function FilePos( f: File): LongInt;

Возвращает номер записи, на которую установлен указатель.

  1. Procedure CloseFile( f: File);

Закрывает файл.

  1. Function Eof(f: File): boolean;

Возвращает True, если достигнут конец файла.

  1. Function FileSize(f: File): LongInt;

Возвращает количество записей в файле. Например, Seek(f, FileSize(f)) установит указатель в конец файла (после последней записи).

  1. Procedure Truncate(f: File of Type);

Уничтожает (отрубает) конец файла начиная с записи, на которую установлен указатель.

Язык Object Pascal не накладывает никаких ограничений на длину записи (теоретически она может иметь размер до 2 Гб).

Пример описания и обращения к функции ReadFromFile, читающей из файла nF в позиции Pos запись r размером Sz.

function ReadFromFile(nF: String; Pos: Word; Var r; Sz: Word): boolean;

Var g: File; Recs, ReadReal: Integer; RecRead: boolean;

Begin

Assign(g, nF); Recs:= FileSize(g) div Sz; {количество записей в файле} RecRead:= (Pos < Recs); {запись с номером Pos есть ?} if RecRead then begin {если запись есть} Reset(g, Sz); {открыть файл}

try

Seek(g, Pos); {установить указатель на запись} BlockRead(g, r, 1, ReadReal); {прочитать запись} RecRead:= (ReadReal = 1); {прочитано успешно ?}

finally Close(g); {закрыть файл} end;

end; Result:= RecRead;

end {ReadFromFile};

Type

tStud = Record Fio: String [60]; Curs: byte; Stipendiya, Room: boolean; End;

Var Stud: tStud;

if ReadFromFile('base2.ff1', 12, Stud, SizeOf(Stud)) then Writeln('Запись из 12-й позиции прочитана');

Приведем еще пример. В директории 'c:\Bases\SdudBase' находится файл 'AllStuds.bs', в котором хранятся данные о студентах в виде записей типа

Type

TStud = Record {студент} Fio: String[50]; {'Фамилия Имя Отчество'} Born: byte; {Год рождения, например, 1979} Faculty: String[4]; {Факультет, например, 'МТФ'} Group: String[8]; {Группа, например, 'МТ 17-2'} End;

Ниже приведена универсальная процедура, которая копирует из этого файла в другой файл данные только о тех студентах, которые имеют заданный год рождения:

Procedure StudsCopy(nF1, nF2: ShortString; BornYear: byte; Var Count: Word; Var: Ind: ShortInt);

{nF1 – файл-источник, nF2 – файл-приёмник, BornYear – требуемый год рождения, Count – скопировано записей, Ind – индикатор контроля: 0 – нормально, 1 – было неверное чтение, была неверная запись}

Var

g: tStud; K, Sz, i,j: Word; f1, f2: File;

Begin

Count:= 0; {инициализация счетчика} Ind:=0; {изначально предполагаем нормальный процесс, иначе Ind изменим} Sz:= SizeOf(g); {размер одной записи} K:= KdnFileSize(nF1, Sz); {количество записей в файле-источнике}

If (K > 0) then {если в файле-источнике есть записи } Begin Assign(f1, nF1); {файл-источник связываем переменной f1} Reset(f,Sz); {открываем файл-источник с записями размера Sz} Assign(f2, nF2); {файл-приёмник связываем переменной f2 } Rewrite(f2,Sz); {создаем новый файл-приёмник под записи размера Sz}

try

For j:=1 to K do Begin BlockRead(f1, g, 1, i); {чтение записи}

Case i of

1: {запись прочитана} if (g.Born = BornYear) then { студент имеет требуемый год рождения} begin BlockWrite(f2, g, 1, i); {запись в файл-приёмник} If (i > 0) then Inc(Count) {если записано правильно} else begin Ind:= 1; Break; End; {записано неверно, сразу выход из цикла} end; {if}

0: begin Ind:= -1; Break; end; {запись не прочитана, сразу выход из цикла} end; {Case}

end; {цикла For}

finally CloseFile(f1); {закрываем файл-источник} CloseFile(f2); {закрываем файл-приёмник} end; {блока try – finally – end}


Страница: