Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi.pdf
Скачиваний:
191
Добавлен:
24.02.2016
Размер:
6.84 Mб
Скачать

Friend := BestFriend;

После выполнения этого оператора значения полей записи Friend станут равными значениям соответствующих полей записи BestFriend.

2.13.2. Записи с вариантами

Строго фиксированная структура записи ограничивает возможность ее применения. Поэтому в языке Delphi имеется возможность задать для записи несколько вариантов структуры. Такие записи называются записями с вариантами. Они состоят из необязательной фиксированной и вариантной частей.

Вариантная часть напоминает условный оператор case. Между словами case

иof записывается особое поле записи – поле признака. Оно определяет, какой из вариантов в данный момент будет активизирован. Поле признака должно быть равно одному из расположенных следом значений. Каждому значению сопоставляется вариант записи. Он заключается в круглые скобки

иотделяется от своего значения двоеточием. Пример описания записи с вариантами:

type

 

TFigure = record

 

X, Y: Integer;

 

case Kind: Integer of

// прямоугольник

0: (Width, Height: Integer);

1: (Radius: Integer);

// окружность

end;

 

Обратите внимание, что у вариантной части нет отдельного end, как этого можно было бы ожидать по аналогии с оператором case. Одно слово end завершает и вариантную часть, и всю запись.

На этом мы пока закончим рассказ о записях, но хотим надеяться, что читатель уже догодался об их потенциальной пользе при организации данных с более сложной структурой.

2.14. Файлы

2.14.1. Понятие файла

С точки зрения пользователя файл — это именованная область данных на диске или любом другом внешнем носителе. В программе файл предстает как последовательность элементов некоторого типа. Так как размер одного

124

файла может превышать объем всей оперативной памяти компьютера, доступ к его элементам выполняется последовательно с помощью процедур чтения и записи.

Для файла существует понятие текущей позиции. Она показывает номер элемента, который будет прочитан или записан при очередном обращении к файлу. Чтение-запись каждого элемента продвигает текущую позицию на единицу вперед. Для большинства файлов можно менять текущую позицию чтения-записи, выполняя прямой доступ к его элементам.

Взависимости от типа элементов различают три вида файла:

файл из элементов фиксированного размера; элементами такого файла чаще всего являются записи;

файл из элементов переменного размера (нетипизированный файл); такой файл рассматривается просто как последовательность байтов;

текстовый файл; элементами такого файла являются текстовые строки.

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

Для работы с файлом, состоящим из типовых элементов переменная объявляется с помощью словосочетания file of, после которого записывается тип элемента:

var

F:file of TPerson;

Кмоменту такого объявления тип TPerson должен быть уже описан (см. выше).

Объявление переменной для работы с нетипизированным файлом выполняется с помощью отдельного слова file:

var

F: file;

Для работы с текстовым файлом переменная описывается с типом TextFile:

var

F: TextFile;

125

2.14.2. Работа с файлами

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

Приступая к работе с файлом, нужно первым делом вызвать процедуру AssignFile, чтобы файловой переменной поставить в соответствие имя файла на диске:

AssignFile(F, 'MyFile.txt');

В результате этого действия поля файловой переменной F инициализируются начальными значениями. При этом в поле имени файла заносится строка 'MyFile.txt'.

Так как файла еще нет на диске, его нужно создать:

Rewrite(F);

Теперь запишем в файл несколько строк текста. Это делается с помощью хорошо вам знакомых процедур Write и Writeln:

Writeln(F, 'Pi = ', Pi);

Writeln(F, 'Exp = ', Exp(1));

При работе с файлами первый параметр этих процедур показывает, куда происходит вывод данных.

После работы файл должен быть закрыт:

CloseFile(F);

Рассмотрим теперь, как прочитать содержимое текстового файла. После инициализации файловой переменной (AssignFile) файл открывается с помощью процедуры Reset:

Reset(F);

Для чтения элементов используются процедуры Read и Readln, в которых первый параметр показывает, откуда происходит ввод данных. После работы файл закрывается. В качестве примера приведем программу, распечатывающую в своем окне содержимое текстового файла 'MyFile.txt':

program Console;

{$APPTYPE CONSOLE}

uses SysUtils;

var

126

F: TextFile;

S: string;

begin

AssignFile(F, 'MyFile.txt'); Reset(F);

while not Eof(F) do begin

Readln(F, S); Writeln(S);

end;

CloseFile(F);

Writeln('Press Enter to exit...'); Readln;

end.

Так как обычно размер файла заранее не известен, перед каждой операцией чтения вызывается функция Eof, которая возвращает True, если достигнут конец файла.

Внимание! Текстовые файлы можно открывать только для записи или только для чтения, но не для того и другого одновременно. Для того чтобы сначала записать текстовый файл, а потом прочитать, его нужно закрыть после записи и снова открыть, но уже только для чтения.

2.14.3. Стандартные подпрограммы управления файлами

Для обработки файлов в языке Delphi имеется специальный набор процедур

ифункций:

AssignFile(var F; FileName: string) — связывает файловую переменную F и файл, имя которого указано в FileName.

Reset(var F [: File; RecSize: Word ] ) — открывает существующий файл.

Если открывается нетипизированный файл, то RecSize задает размер элемента файла.

Rewrite(var F [: File; RecSize: Word ] ) — создает и открывает новый файл.

Append(var F: TextFile) — открывает текстовый файл для добавления текста.

Read(F, V1 [, V2, ..., Vn ]) — начиная с текущей позиции, читает из типизированного файла подряд расположенные элементы в переменные V1, V2, ..., Vn.

Read(var F: TextFile; V1 [, V2, ..., Vn ] ) — начиная с текущей позиции,

читает из текстового файла символы или строки в переменные V1, V2,

..., Vn.

127

Write(F, V1 [, V2, ..., Vn ]) — начиная с текущей позиции, записывает в типизированный файл значения V1, V2, ..., Vn.

Write(var F: TextFile; V1 [, V2, ..., Vn ] ) — начиная с текущей позиции указателя чтения-записи, записывает в текстовый файл значения V1, V2, ..., Vn.

CloseFile(var F) — закрывает ранее открытый файл.

Rename(var F; NewName: string) — переименовывает неоткрытый файл F любого типа. Новое имя задается в NewName.

Erase(var F) — удаляет неоткрытый внешний файл любого типа, заданный переменной F.

Seek(var F; NumRec: Longint) — устанавливает позицию чтения-записи на элемент с номером NumRec; F — типизированный или нетипизированный файл.

SetTextBuf(var F: TextFile; var Buf [; Size: Word]) — назначает текстовому файлу F новый буфер ввода-вывода Buf объема Size.

SetLineBreakStyle(var T: Text; Style: TTextLineBreakStyle) —

устанавливает способ переноса строк в файле (одиночный символ #10 или пара символов #13#10).

Flush(var F: TextFile) — записывает во внешний файл все символы, переданные в буфер для записи.

Truncate(var F) — урезает файл, уничтожая все его элементы, начиная с текущей позиции.

IOResult: Integer — возвращает код, характеризующий результат (была ошибка или нет) последней операции ввода-вывода.

FilePos(var F): Longint — возвращает для файла F текущую файловую позицию (номер элемента, на которую она установлена, считая от нуля). Не используется с текстовыми файлами.

FileSize(var F): Longint — возвращает число компонент в файле F. Не используется с текстовыми файлами.

Eoln(var F: Text): Boolean — возвращает булевское значение True, если текущая позиция чтения-записи находится на маркере конца строки. Если параметр F не указан, функция применяется к стандартному устройству ввода с именем Input.

Eof(var F): Boolean — возвращает булевское значение True, если текущая позиция чтения-записи находится сразу за последним элементом, и False в противном случае.

SeekEoln(var F: Text): Boolean — возвращает True при достижении маркера конца строки. Все пробелы и знаки табуляции, предшествующие маркеру, пропускаются.

128

SeekEof(var F: Text): Boolean — возвращает значение True при достижении маркера конца файла. Все пробелы и знаки табуляции, предшествующие маркеру, пропускаются.

Для работы с нетипизированными файлами используются процедуры BlockRead и BlockWrite. Единица обмена для этих процедур 128 байт.

BlockRead(var F: File; var Buf; Count: Word [; Result: Word] ) —

считывает из файла F определенное число блоков в память, начиная с первого байта переменной Buf. Параметр Buf представляет любую переменную, используемую для накопления информации из файла F. Параметр Count задает число считываемых блоков. Параметр Result является необязательным и содержит после вызова процедуры число действительно считанных записей. Использование параметра Result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Count.

BlockWrite(var F: File; var Buf; Count: Word [; Result: Word]) —

предназначена для быстрой передачи в файл F определенного числа блоков из переменной Buf. Все параметры процедуры BlockWrite аналогичны параметрам процедуры BlockRead.

ChDir(const S: string) — устанавливает текущий каталог.

CreateDir(const Dir: string): Boolean — создает новый каталог на диске.

MkDir(const S: string) — аналог функции CreateDir. Отличие в том, что в случае ошибки при создании каталога функция MkDir создает исключительную ситуацию.

DeleteFile(const FileName: string): Boolean — удаляет файл с диска.

DirectoryExists(const Directory: string): Boolean — проверяет,

существует ли заданный каталог на диске.

FileAge(const FileName: string): Integer — возвращает дату и время файла в числовом системно-зависимом формате.

FileExists(const FileName: string): Boolean — проверяет, существует ли на диске файл с заданным именем.

FileIsReadOnly(const FileName: string): Boolean — проверяет, что заданный файл можно только читать.

FileSearch(const Name, DirList: string): string — осуществляет поиск заданого файла в указанных каталогах. Список каталогов задается параметром DirList; каталоги разделяются точкой с запятой для операционной системы Windows и запятой для операционной системы Linux. Функция возвращает полный путь к файлу.

FileSetReadOnly(const FileName: string; ReadOnly: Boolean): Boolean —

делает файл доступным только для чтения.

129

FindFirst/FindNext/FindClose

ForceDirectories(Dir: string): Boolean — создает новый каталог на диске. Позволяет одним вызовом создать все каталоги пути, заданного параметром Dir.

GetCurrentDir: string — возвращает текущий каталог.

SetCurrentDir(const Dir: string): Boolean — устанавливает текущий каталог. Если это сделать невозможно, функция возвращет значение

False.

RemoveDir(const Dir: string): Boolean — удаляет каталог с диска;

каталог должен быть пустым. Если удалить каталог невозможно, функция возвращет значение False.

RenameFile(const OldName, NewName: string): Boolean — изменяет имя файла. Если это сделать невозможно, функция возвращет значение

False.

ChangeFileExt(const FileName, Extension: string): string — возвращает имя файла с измененным расширением.

ExcludeTrailingPathDelimiter(const S: string): string — отбрасывает символ-разделитель каталогов (символ ‘/’ — для Linux и ‘\’ — для Windows), если он присутствует в конце строки.

IncludeTrailingPathDelimiter(const S: string): string — добавляет символ-разделитель каталогов (символ ‘/’ — для Linux и ‘\’ — для Windows), если он отсутствует в конце строки.

ExpandFileName(const FileName: string): string — возвращает полное имя файла (с абсолютным путем) по неполному имени.

ExpandUNCFileName(const FileName: string): string — возвращает полное сетевое имя файла (с абсолютным сетевым путем) по неполному имени. Для операционной системы Linux эта функция эквивалентна функции ExpandFileName.

ExpandFileNameCase(const FileName: string; out MatchFound: TFilenameCaseMatch): string — возвращает полное имя файла (с

абсолютным путем) по неполному имени, допуская несовпадения заглавных и строчных букв в имени файла для тех файловых систем, которые этого не допускают (например, файловая система ОС Linux).

ExtractFileDir(const FileName: string): string — выделяет путь из полного имени файла; путь не содержит в конце символ-разделитель каталогов.

ExtractFilePath(const FileName: string): string — выделяет путь из полного имени файла; путь содержит в конце символ-разделитель каталогов.

130

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