2.14. Файлы
2.14.1. Понятие файла
Тип файла | Описание файла | Пример |
текстовый файл (текст) | text | var t: text; |
типизированный файл | file of тип-элемента | var a: file of integer; |
Процедуры и функции | Операция | Пример |
read( файл, список ввода ) | Ввод данных из файла | read(t,a,b,c); |
readln( файл, список ввода ) | Ввод данных из файла | readln(t,a,b,c); |
write( файл, список вывода ) | Вывод данных в файл | write(t,x,y,z); |
writeln( файл, список вывода ) | Вывод данных в файл | writeln(t,x,y,z); |
assign( файл, имя файла ) | Определить имя файла | assign(t,'c:\text\info.txt'); |
reset( файл ) | Открыть файл для ввода | reset(t); |
rewrite( файл ) | Открыть файл для вывода | rewrite(t); |
close( файл ) | Закрыть файл | close(t); |
eof( файл ) | Если конец файла, то true (функция) | while not eof(t) do read(t,a); |
eoln( файл ) | Если конец строки, то true (функция) | while not eoln(t) do read(t,a); |
С точки зрения пользователя файл — это именованная область данных на диске или любом другом внешнем носителе. В программе файл предстает как последовательность элементов некоторого типа. Так как размер одного файла может превышать объем всей оперативной памяти компьютера, доступ к его элементам выполняется последовательно с помощью процедур чтения и записи.
Для файла существует понятие текущей позиции. Она показывает номер элемента, который будет прочитан или записан при очередном обращении к файлу. Чтение-запись каждого элемента продвигает текущую позицию на единицу вперед. Для большинства файлов можно менять текущую позицию чтения-записи, выполняя прямой доступ к его элементам.
В зависимости от типа элементов различают три вида файла:
- файл из элементов фиксированного размера; элементами такого файла чаще всего являются записи;
- файл из элементов переменного размера (нетипизированный файл); такой файл рассматривается просто как последовательность байтов;
- текстовый файл; элементами такого файла являются текстовые строки.
Для работы с файлом в программе объявляется файловая переменная. В файловой переменной запоминается имя файла, режим доступа (например, только чтение), другие атрибуты. В зависимости от вида файла файловая переменная описывается по-разному.
Для работы с файлом, состоящим из типовых элементов переменная объявляется с помощью словосочетания file of, после которого записывается тип элемента:
var F: file of TPerson; |
К моменту такого объявления тип TPerson должен быть уже описан (см. выше).
Объявление переменной для работы с нетипизированным файлом выполняется с помощью отдельного слова file:
var F: file; |
Для работы с текстовым файлом переменная описывается с типом TextFile:
var
F: TextFile;
|
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 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.
- 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 при достижении маркера конца строки. Все пробелы и знаки табуляции, предшествующие маркеру, пропускаются.
- 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 — делает файл доступным только для чтения.
- 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 — выделяет путь из полного имени файла; путь содержит в конце символ-разделитель каталогов.
- ExtractRelativePath(const BaseName, DestName: string): string — возвращает относительный путь к файлу DestName, отсчитанный от каталога BaseName. Путь BaseName должен заканчиваться символом-разделителем каталогов.
- ExtractFileDrive(const FileName: string): string — выделяет имя диска (или сетевого каталога) из имени файла. Для операционной системы Linux функция возвращает пустую строку.
- ExtractFileExt(const FileName: string): string — выделяет расширение файла из его имени.
- ExtractFileName(const FileName: string): string — выделяет имя файла, отбрасывая путь к нему.
- IsPathDelimiter(const S: string; Index: Integer): Boolean — проверяет, является ли символ S[Index] разделителем каталогов.
- MatchesMask(const Filename, Mask: string): Boolean — проверяет, удовлетворяет ли имя файла заданной маске.