Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы алгоритмизации и программирования. Часть 1. Конспект лекций.pdf
Скачиваний:
0
Добавлен:
09.08.2026
Размер:
465 Кб
Скачать

Файлы в ТР

В ТР наряду с описанием переменных, массивов, строк и других объектов можно также объявить и описать файлы, а также работать с ними. Объявление файлов, точнее файловых переменных (<ф.п.>), можно делать одним из трех способов:

var <ф.п.>:file of <тип>; <ф.п.>:text; <ф.п.>:file;

При объявлении file of <тип> мы задаем тип содержимого файла, и поэтому такие файлы называются типизированными. Частным случаем типизированных файлов являются текстовые файлы и декларируются ключевым словом text. При объявлении файлов без указания <типа> содержимое файлов может интерпретироваться по-разному (как байты

или как вещественные числа или по-другому), такие файлы называют-

ся нетипизированными.

Пример. var f:file of byte – описываем файл f как набор байтов.

Общие принципы работы с файлами в ОС

Для того чтобы получить доступ к файлу, программа должна запросить у ОС разрешение на доступ к выбранному файлу, предварительно указав имя (и путь) файла, тип доступа (только по чтению или на чтение-запись) и тип совместного доступа. В случае удовлетворения запроса ОС выдает дескриптор(номер) файла и программа в дальнейшем работает только с этим номером, а не с именем файла. Для того чтобы работать с файловыми данными, эти данные должны быть предварительно считаны из файла в ОП – файловый буфер, который должна выделить сама программа и указать ОС, куда считывать данные из файла и откуда записывать в файл.

Задача-пример. Вывести содержимое файла с:\config.sys на экран.

Program FileRead;

var s:string; {выделяем буфер чтения в памяти} f:text; {работаем как с текстовым файлом}

begin Assign(f,'с:\config.sys'); Reset(f);

While not EOF(f) do begin {пока нет конца файла...}

32

Readln(f,s);

{считываем текущую строку из файла f...}

writeln(s)

{ и отображаем ее на экран}

end;

{конец цикла}

Close(f)

 

end;

 

Assign – функция привязки имени файла к файловой переменной, т.е. дескриптору, выданному ОС.

Reset – (для текстовых файлов) открыть только для чтения. EOF(End Of File) – функция, распознающая конец файла после чте-

ния файла и сигнализирующая об этом. Может возвращать только два значения: TRUE и FALSE.

Rewrite(<ф.п.>) – открыть файл для перезаписи, при этом старое содержимое файла пропадает и запись в файл осуществляется с начального байта.

Append(<ф.п.>) – открыть текстовый файл для добавления строк после последней.

Close(<ф.п.>) – завершить работу с файлом и вернуть дескриптор ОС. Знакомые нам подпрограммы ввода-вывода данных могут использоваться в расширенном формате описания и для ввода-вывода файло-

вых данных:

Read(<ф.п.>,<список пар-ров>)

Write(<ф.п.>,<список пар-ров>)

Длина любого компонента для типизированных файлов (кроме текстовых) постоянна и поэтому с помощью подпрограмм Seek и FilePos можно организовать прямой доступ к любому месту файла, а также осуществлять ввод-вывод в любое место файла.

Задача-пример. Переразместить байты в файле в обратном порядке.

Program Reverse;

var f:file of byte; i,k:longint; a,b:byte;

begin

assign(f,ParamStr(1)); {подадим имя файла из командной строки} Reset(f); {Получим доступ к типизированному файлу для пере-

записи}

k:=FileSize(f)-1; {Присвоим переменной k длину файла f - 1} {Будем в цикле обрабатывать файл от начала до середины (k/2)} for i:=0 to (k div 2) do begin

33

Seek(f,i); Read(f,a); {Прочитать с i-го байта файла в пер-ую а} Seek(f,k); Read(f,b); {Прочитать с k-го байта файла в пер-ую b} Seek(f,k); Write(f,a); {Записать число a в k-й байт файла f}

Seek(f,i); Write(f,b); {Записать число b в i-й байт файла f} K:=k-1

end;

Close(f)

end;

где Seek – подпрограмма перемещения указателя файла в указанное место.

При работе с нетипизированными файлами используются функции блочного ввода-вывода данных:

BlockRead(<ф.п.>,<буфер>,<кол-во байт>,<кол-во реально прочит. байт>)

BlockWrite(<ф.п.>,<буфер>,<кол-во байт>,<кол-во реально запис. байт>)

Перепишем наш пример:

Program Reverse;

CONST N=64000;

var a:array[1..N] of byte; i,k:longint;

f:file;

c:byte;

begin

assign(f,ParamStr(1)); {подадим имя файла из командной строки} Reset(f,1); {Рекомендуется для нетипизированных файлов уста-

новить длину в 1}

BlockRead(f,a,N,k); {Считываем N байтов из файла f в массив а}

{Переразмещаем k прочитанных байтов в памяти – в массиве a} for i:=1 tо (k div 2) do begin

c:=a[i]; a[i]:=a[k-i+1]; a[k-i+1]:=c

end;

BlockWrite(f,a,k,k); {Запишем полученный массив a в файл f} Close(f)

end;

34

Замечание. На Turbo Pascal, как на 16-битную программу, накладываются ограничения по объему резервируемой памяти, которая не должна превышать 64 Kb. В Delphi и Free Pascal ограничения ослаблены, можно резервировать до 2 Gb. Имеется 64-битная версия FP, где память можно резервировать до 4 Tb и более.

ЭЛЕМЕНТЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

Объектно-ориентированного программирования (ООП) – это методология программирования, которая основывается на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию, основанную на принципах наследуемости. При процедурном подходе требуется описать каждый шаг, каждое действие алгоритма. В ООП за объектом остается право решать, как отреагировать и что сделать в ответ на поступивший вызов.

Объект – это совокупность переменных состояния и связанных с

ними методов (операций).

К базовым понятиям ООП относятся:

инкапсуляция (Encapsulation);

наследование (Inheritance);

полиморфизм (Polymorphism).

Инкапсуляция

Формат описания объекта: Type <идентификатор типа объекта>=

Object

<поле>;

......

<поле>; <метод>;

......

<метод>;

End;

Поле содержит имя и тип данных. Методы – это подпрограммы, описанные внутри объектного типа.

35

Пример. type TPoint = object

{координаты точки}

x,y:integer;

Color:word;

{цвет точки}

Visible:boolean;

{признак светимости}

Procedure SetLocation(x,y:integer);

 

{подпрограмма задания нового по-

 

ложения точки на экране}

Procedure SetColor(Color:word);

 

{подпрограмма задания нового цве-

 

та точки на экране}

Procedure SetVisible(Vis:boolean);

 

{Выводит или гасит точку}

Procedure GetLocation(var x,y:integer);

 

{получает координаты точки}

Function GetColor:word;

{получает цвет точки}

Function GetVisible:boolean;

{получает признак све-

end;

 

тимости точки}

{конец описания объекта TPoint}

Описание объектного типа, собственно, и выражает такое свойство, как инкапсуляция. Инкапсулированные в объект подпрограммы называются методами. Рассмотрим пример использования данного объекта (точки на экране с координатами х и y, ее свойствами Color и Visible и связанными с ней методами) в следующем фрагменте программы:

var point:TPoint; {экземпляр объекта TPoint} x,y:integer;

. . . . . . . . .

if point.GetVisible then point.SetVisible(FALSE); {гасим точку} point.SetLocation(x+2,y+2); {зададим новые координаты} point.SetVisible(TRUE); {высвечиваем точку}

. . . . . . . . .

Сами методы при описании не раскрываются, указывается лишь их заголовок. Предполагается, что они описываются где-то ниже по тексту программы, например:

type TPoint = object

. . . . . . . . . . .

end;

Procedure TPoint.SetVisible(Vis:boolean); begin

36

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]