Файлы в Паскале Файл – именованный набор данных на внешнем носителе. Типизированные файлы Типизированный файл – это файл произвольного типа, у которого тип компонент может быть любым, кроме файлового. Обмен данными между памятью и внешним устройством осуществляется при помощи файлов. ЭВМ Внешнее устройство ОЗУ Данные и программы Файлы Данные и программы Описание типизированного файла: Type tf=file of <тип компонент>; Var f:tf; g:file of <тип компонент>; Например: Type tf=file of real; tm=array[1..50] of integer; Var f:tf; g:file of char; fm: file of tm; x:real; c:char; m:tm; Структура типизированного файла - линейная: #26 0 1 2 3 4 и т. д. Так как все компоненты одного типа, то между ними нет никаких маркеров. Ставится только маркер конца файла (#26). Компоненты типизированного файла называются записями. Записи нумеруются с нуля. Для типизированного файла реализовано два способа доступа к записям: 1 последовательный (записи файла читаются и записываются одна за другим последовательно) прямой (можно установить указатель перед любой записью файла и прочитать или записать ее. Указатель устанавливается при помощи процедуры seek) . Типизированные файлы хранятся на магнитных носителях. Процедуры и функции, определенные над типизированными файлами 1. Assign(var f:tf; filename:string); – устанавливает соответствие между физическим и логическим именами файла. Наличие этой процедуры обязательно. Примеры: Assign(f, ‘w:\info\kl10\a.dat’); в качестве расширения у типизированного файла указывается ‘dat’. Writeln(‘input filename’); {ввод физического имени файла через переменную filename} Readln(filename); Assign(f,filename); 2. Reset(var f:tf); - открытие файла для чтения. Указатель файловой переменной устанавливается перед первой компонентой. Файл готов для чтения. Если файла с таким именем нет, то выдается сообщение об ошибке. Reset(f); 3. Rewrite(var f:tf); - открытие файла для записи. Если такого файла нет, то создается метка файла и указатель файловой переменной устанавливается перед первой компонентой. Если файл с таким именем есть, то указатель также устанавливается перед первой компонентой. Содержимое файла при записи будет стерто. За этим должен следить программист. 4. Eof(var f:tf): boolean; - определяется конец файла. Функция возвращает значение true, если встретился маркер конца файла (#26). 5. Close(var f:tf); - закрытие файла для чтения или записи. Устанавливается маркер конца файла (#26). По окончании работы файл должен быть обязательно закрыт, иначе к нему не будет доступа. Close(f); 6. Read(var f:tf; k:<тип компонента>); - чтение компоненты из файла в переменную k. 7. Write(var f:tf; k:<тип компонента>); - запись из переменной k в компоненту файла. k После чтения/записи компоненты, указатель перемещается к следующей компоненте. 8. FileSize(var F) : LongInt; - возвращает количество компонент типизированного файла. 9. FilePos(var F) : LongInt; - возвращает номер позиции указателя файловой переменной. 10. Seek(var F; N: LongInt); - устанавливает указатель перед компонентой N. Например: seek(f,0); - устанавливает указатель перед нулевой компонентой. seek(f,5); - устанавливает указатель перед пятой компонентой. 11. Truncate(var F); - удаляется часть файла, начиная с текущей позиции указателя и до его конца. 2 Например: seek(f,15); truncate(f); - удаляются все компоненты, начиная с 15-й и до конца файла. Особенности типизированного файла 1. 2. 3. 4. 5. Это произвольный тип файла. Один тип компонент (любой, кроме файлового). Доступ к компонентам файла прямой и последовательный. Файл открывается процедурами reset и rewrite и для чтения и для записи. Типизированный файл хранится на магнитных носителях. Примеры программ 1. Создание типизированного файла. (Типизированный файл нельзя создать при помощи текстового редактора.) Var f:file of real; k:real; fname:string; n,i:integer; begin writeln(‘input fname’); readln(fname); assign(f,fname); rewrite(f); writeln(‘input n’); readln(n); for i:=1 to n do begin readln(k); write(f,k); end; close(f); end. 2. Подсчитать сумму всех компонент целочисленного типизированного файла. (Читая записи последовательно.) Var f:file of integer; fname:string; k, sum:integer; begin writeln(‘input fname’); readln(fname); assign(f,fname); reset(f); sum:=0; while not eof(f) do begin read(f,k); sum:=sum+k; end; close(f); writeln(‘sum=’,sum); end. 3. В типизированном файле вещественного типа поменять местами первую и последнюю компоненты. (Прямой доступ.) Var f:file of real; 3 x,y:real; fname:string; begin writeln(‘input fname’); readln(fname); assign(f,fname); reset(f); read(f,x); seek(f,filesize(f)-1); read(f,y); seek(f,0); write(f,y); seek(f,filesize(f)-1); write(f,x); close(f); end. 4