Программа на DelphiРефераты >> Программирование и компьютеры >> Программа на Delphi
Перемещает указатель на запись с номером N. Первая запись имеет порядковый номер 0.
- Function FilePos( f: File of Type): LongInt;
Возвращает номер записи, на которую установлен указатель.
- Procedure CloseFile( f: File of Type);
Закрывает файл.
- Function Eof(f: File of Type): boolean;
Возвращает True, если достигнут конец файла.
- Function FileSize(f: File of Type): LongInt;
Возвращает количество записей в файле. Например, Seek(f, FileSize(f)) установит указатель в конец файла (после последней записи).
- Procedure Truncate(f: File of Type);
Уничтожает (отрубает) конец файла начиная с записи, на которую установлен указатель.
17.4. Файлы без типа
Файл состоит из компонент одинакового размера. Тип данных не имеет значения. Доступ к данным осуществляется через файловую переменную. Как и в файлах с типом, в таком файле допустим прямой доступ к любой записи, причем в рамках открытого файла допустимо как писать, так и читать записи.
Файловая переменная может быть объявлена так:
Var F: File;
После каждого чтения или вывода записи указатель автоматически устанавливается на следующую запись.
Отсутствие типа записи позволяет выполнять обработку файлов различных типов с помощью универсальных процедур и функций.
17.4.1. Процедуры и функции для работы с файлом без типа
- Procedure AssignFile( f: File; FileName: String);
Связывает файловую переменную f с дисковым файлом FileName.
- Procedure Rewrite( f: File);
Создает новый файл и открывает его. Если файл существует, то он уничтожается и создается как новый.
- Procedure Reset( f: File[; Size: Word]);
Открывает существующий файл и устанавливает указатель на первую запись. При отсутствии файла возникает ошибка ввода/вывода. Параметр Size указывает размер записи открываемого файла. При его отсутствии размер записи по умолчанию равен 1.
- Procedure BlockRead( f: File; Var Buf; Count: Word[; Var Result: Word]);
Читает из файла Count записей в переменную Buf. Result – реально прочитанное количество записей.
- Procedure BlockWrite( f: File; Var Buf; Count: Word[; Var Result: Word]);
Пишет в файл первых Count записей из переменной Buf. Result – реально записанное количество записей.
- Procedure Seek( f: File; N: LongInt);
Перемещает указатель на запись с номером N. Первая запись имеет порядковый номер 0.
- Function FilePos( f: File): LongInt;
Возвращает номер записи, на которую установлен указатель.
- Procedure CloseFile( f: File);
Закрывает файл.
- Function Eof(f: File): boolean;
Возвращает True, если достигнут конец файла.
- Function FileSize(f: File): LongInt;
Возвращает количество записей в файле. Например, Seek(f, FileSize(f)) установит указатель в конец файла (после последней записи).
- 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}