- •Обращение к полям записи
- •Оператор with
- •Записи с вариантами
- •Рекурсия
- •Вычислить n!
- •Вычисления чисел Фибоначчи
- •Вычисления значений формул
- •Быстрая сортировка
- •Процедуры и функции общие для всех типов файлов
- •Режимы работы файла
- •Опция компиляции
- •Процедуры и функции модуля system
- •Процедуры и функции для типизированных файлов
- •Как добиться прямого доступа??
- •Стандартная конструкция редактирования файла
- •Тектовые файлы
- •Процедуры и функции для текстовых файлов
- •Способы считывания
- •Бинарные файлы
- •Работа с динамической памятью
- •Pointer
- •Дерево Absolute
- •Типизированные ( переменные ) указатели
- •Процедуры работы с кучей
- •Динамические массивы
- •Связные списки
- •Упорядоченные списки
- •Деревья
Режимы работы файла
Закрыт
{Когда файл находится в режиме «закрыт» из файла нельзя считывать информацию, записывать нельзя. Можно переименовывать, удалять, открывать }
Файл открыт для чтения (read)
Открыт для записи (write)
Открыт для записи и чтения
Опция компиляции
{$I+} –inputoutput(когда плюс – программа прерывается при ошибке ввода вывода. Если отключена, то программа продолжает работать даже при ошибках ввода - вывода)
assignFile(f,’c:\temp\my.pas’);
{$i-}
Reset(f);
{$I+}
If IOresult <>0 then begin
Writeln(‘Ошибка открытия фала’);
Halt(1);{Завершает работу программы}
End;
Процедуры и функции модуля system
Procedurerename(varf;newfn:string) {Переименовывает файл с которым связана переменнаяf. Файл получает имяnewfn. Переименовывать можно только закрытые и существующие файлы}
Assignfile(f,’temp.tmp’);
Reset(f);
……..
Close(f);
Rename(f,’new.new’);
Procedure erase(varf) {Удаляет существующий и закрытый файл}
Proceduremkdir(name:string) {Создает директорию по заданному пути.}
Procedurechdir(newdir:string) {изменить текущую рабочую папку}
Procedure rmdir(name:string) {Удаляет пустую папку}
Procedure getdir(drive:byte; var dir:string); {0-активное устройство. 3-диск С. Пишет путь до текущей рабочей папки}
Процедуры и функции для типизированных файлов
Procedureread(varf;v1,v2,..,vn); {Позволяет читать из файла данные которые записываются в переменныеv1,v2,..,vn}
Var f:file of integer;
X:integer;
Begin
Assignfile(f,’1.tst’);
Reset(f);
While not eof(f) do begin
Read(f,x); write(x);
End;
Closefile(f);
End.
{Пока не достигнут конец файла мы считываем из файла f число интежер и выводи на консоль}
Procedurewrite(varf,v1,v2,..,vn) {записывает в файл Ф данныеv1,v2,..vn}
Var f:file of integer;
X,i:integer;
Begin
Assignfile(f,’1.tst’);
Rewrite(f);
For i:=1 to n do begin
Read(x); write(f,x);
End;
Closefile(f);
End.
{Плохое копирование}
Var fin,fout:file of byte;
B:byte;
Begin
Assignfile (fin,’test.tst’);
Reset(fin);
Assignfile(fout,’test.new’);
Rewrite(fout);
While not eof(fin) do begin
Read(fin,b);
Write(fout,b);
End;
Closefile(fin);
Closefile(fout);
End.
{Возникают проблемы с памятью}
{Просто пример}
Var fch:file of char;
Ch:char;
Begin
Assignfile(fch,’test.tst’);
Reset(fch);
For ch:=’A’ to ‘Z’ do
Write(fch,ch);
Closefile(fch);
End.
Как добиться прямого доступа??
Functionfilesize(varf):longint; {Размер файла в компанентах}
Functionfilepos(varf):longint; {Возвращает номер позиции текущей компоненты}
For i:=1 to filesize(f) do begin
Read(f,x);
……
End.
Procedureseek(varf;n:longint); {Перемещене курсора на указанную позицию. У первого компонента ноль. У последнего Фаилсайз-1}
Proceduretruncate(varf); {Обрезает фаил с текущей позиции до конца файла}
Seek(f,filesize(f) div 2);
Truncate(f);
Стандартная конструкция редактирования файла
Type base=….;{Базовй тип компонентов файла}
Var f:file of base; buf:base;
Begin
Assignfile(f,’test.tst’);
{$I-}
Reset(f);
{$I+}
Ioresult<>0 then begin
Writeln(‘ошибка’); halt(1);
End;
While not eof (f)do begin
Read(f,buf); {Изменение буфера
Buf:=…}
Seek(f,filepos(f)-1);
Write(f,buf);
End;
Closefile;
End.