Стандартные процедуры и функции для работы с файлами

Назначение файла

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

Синтаксис процедуры следующий:

AssignFile(var F, FileName: string);

Имя файла задается согласно принятым правилам для ОС Windows.

Пример:

Примеры обращения к процедуре AssignFile:

AssignFile(F, ‘c:\pascal\result.pas’);

или

FFname:=’Prime.txt’

AssignFile(F, FFname);

Операции ввода/вывода

Чтение и запись – это две самые распространенные операции, выполняемые при работе с файлами. Для их выполнения применяются специальные функции файлового ввода/вывода. В Delphi ввод/вывод информации осуществляется тремя способами. Первый способ – использование интерфейсных элементов (редакторы, метки и так далее). Второй способ – использование дескриптора файла. Третий – использование файловой переменной. Этот способ, традиционный для языка Паскаль, подробно описан ниже.

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

Для выполнения операции чтения или записи необходимо выполнить следующие действия.

· объявить файловую переменную необходимого типа;

· при помощи функции AssignFile связать эту переменную с требуемым файлом;

· открыть файл при помощи функций Append, Reset, Rewrite;

· выполнить операции чтения или записи. При этом в зависимости от сложности задачи и структуры данных может использоваться целый ряд вспомогательных функций;

· закрыть файл при помощи функции CloseFile.

По сравнению с языком Turbo Pascal в Delphi изменились названия только двух функций: Assign стала AssignFile, a Close превратилась в CloseFile.

Функции, используемые для файлового ввода/вывода

Открытие файла может осуществляться тремя процедурами — в зависимости от его дальнейшего использования.

Процедура

procedure Reset(var F [: File; RecSize: Word ]);

открывает существующий файл для чтения и записи, текущая позиция устанавливается на первой строке файла.

Процедура

procedure Append(var F: Text);

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

Процедура

procedure ReWrite(var F: File [;Recsize: Word ]);

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

Переменная RecSize используется только при работе с нетипизированными файлами и определяет размер одной записи для операции передачи данных. Если данный параметр опущен, то по умолчанию значение RecSize равно 128 байт.

Чтение данных из типизированных и текстовых файлов выполняют процедурами Read или Readln.

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

procedure Read([var F: Text;] VI [, V2,...,Vn]); —для текстовыхфайлов;

procedure Read(F, VI [, V2,...,Vn]); — для других типизированныхфайлов.

VI [, V2,...,Vn])— это список ввода.

При одном вызове процедуры можно читать данные в произвольное число переменных. Естественно, что тип переменных должен совпадать с типом файла. При чтении в очередную переменную читается ровно столько байт из файла, сколько занимает тип данных. В следующую переменную читается столько же байтов, расположенных следом. После выполнения процедуры текущая позиция устанавливается на первом непрочитанном байте. Аналогично работают несколько процедур Read для одной переменной, выполненных подряд.

Процедура

procedure Readln([var F: Text;] VI [,V2,...,Vn]);

считывает одну строку текстового файла и устанавливает текущую позицию на следующей строке. Если использовать процедуру без переменных v1..vn, то она просто передвигает текущую позицию на следующую строку файла.

Процедуры для записи в файл Write и Writeln описываются аналогично:

procedure Write([var F: Text;] T1 [,T2,...,Tn]);

procedure Writeln([var F:Text;] T1 [,T2,...,Tn]);

Параметры T1, T2,..., Tn могут быть одним из целых, вещественных, строковых типов или логическим типом. Но у них есть возможность дополнительного форматирования при выводе. Каждый параметр записи может иметь форму:

Pn [: MinWidth [: DecPlaces ] ],

где

pn — выводимая переменная или выражение;

MinWidth — минимальная ширина поля в символах, которая должна быть больше 0;

DecPlaces — содержит количество десятичных символов после запятой при отображении вещественных чисел с фиксированной точкой.

Пример:

Если в диалоге открытия файла OpenDlg (см. раздел “Стандартные диалоги”) был выбран файл, то его имя связывается с файловой переменной F при помощи процедуры AssignFile. В качестве имени файла рекомендуется всегда передавать полное имя файла (включая путь). Как раз в таком виде возвращают результат выбора файла стандартные диалоги TOpenDialog, TOpenPictureDialog. Затем при помощи процедуры Reset этот файл открывается для чтения и записи.

var F: TextFile;

S: string;

begin

if OpenDlg.Execute

then

AssignFile(F, OpenDlg.FileName)

else

Exit;

Reset(F);

while not EOF(F) do

begin

Readln(F, S);

Memo.Lines.Add(S);

end;

CloseFile(F);

end;

В цикле While осуществляется чтение из файла текстовых строк и запись их в компонент Memo. Процедура ReadLn осуществляет чтение текущей строки файла и переходит на следующую строку. Цикл выполняется, пока функция EOF не сообщит о достижении конца файла. После завершения чтения файл закрывается.

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

Для текстовых файлов в функциях Read и Write файловая переменная F может быть опущена. В этом случае чтение и запись осуществляются в стандартные файлы ввода/вывода. Когда программа компилируется как консольное приложение (флаг ($apptype console)), Delphi автоматически связывает входной и выходной файлы с окном консоли (монитором).

Для контроля текущей позицией в файле применяются две основные функции. Функция EOF(F) возвращает значение True, если достигли конца файла. Функция EOLn(F) аналогично сообщает о достижении конца строки. Естественно, в качестве параметра F в функции необходимо передавать файловую переменную.

Процедура

procedure Seek(var:F;N:Longint);

обеспечивает смещение текущей позиции на N элементов. Размер одного элемента в байтах зависит от типа данных файла (типизированной переменной).

Рассмотрим теперь режим блочного ввода/вывода данных между файлом и областью адресного пространства (буфером). Он отличается значительной скоростью передачи данных, причем скорость пропорциональна размеру одного передаваемого блока — чем больше блок, тем больше скорость.

Для реализации этого режима необходимо использовать только нетипизированные файловые переменные. Размер блока определяется в процедуре открытия файла (Reset, Rewrite). Непосредственно для выполнения операций используются процедуры BlockRead и BlockWrite.

Процедура

procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

выполняет запись блока из файла в буфер. Параметр F ссылается на файловую переменную, связанную с нужным файлом.

Параметр Buf определяет любую переменную (число, строка, массив, структура), в которую читаются байты из файла. Параметр Count определяет число считываемых блоков. Наконец, необязательный параметр AmtTransferred возвращает число реально считанных блоков.

При использовании блочного чтения или записи размер блока необходимо выбирать таким образом, чтобы он был кратен размеру одного значения того типа, который хранится в файле. Например, если в файле хранятся значения типа Double (8 байт), то размер блока может быть равен 8, 16, 24, 32 и т. д. Блочное чтение из такого файла выглядит следующим образом:

Пример:

В этом примере имя файла получаем с помощью стандартного диалога. Файловая переменная F описывается просто как File.

var F: File;

DoubleArray: array [0..255] of Double;

Transfered: Integer;

begin

if OpenDIg.Execute

then AssignFile(F, OpenDlg.FileName)

else

Exit;

Reset(F, 64);

BlockRead(F, DoubleArray, 32, Transfered);

CloseFile(F);

ShowMessage('Считано' + IntToStr(Transfered) + 'блоков');

end;

Размер блока устанавливается в процедуре Reset и кратен размеру элемента массива DoubleArray, в который считываются данные. В переменной Transfered возвращается число считанных блоков. Если размер файла меньше заданного в процедуре BlockRead числа блоков, то ошибка не возникает, а в переменной Transfered возвращается число реально считанных блоков.

Процедура BlockWrite применяется для записи информации блоками в файл.

procedure BlockWrite(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

используется аналогично.

В нижеследующей таблице представлены еще некоторые процедуры и функции для работы с файлами:

Объявление Описание
function ChangeFileExt(const FileName, Extension: string): string; Функция позволяет изменить расширение файла, при этом сам файл не переименовывается
procedure ChDir(S:string); Процедура изменяет текущий каталог на другой, путь к которому описан в строке s
procedure CloseFile(var F); Вызов процедуры разрывает связь между файловой переменной и файлом на диске Имя этой процедуры изменено из-за конфликта имен в Delphi (в Borland Pascal используется процедура Close)
function DeleteFile(const FileName: string): Boolean; Функция производит удаление файла FileName с диска и возвращает значение False, если файл удалить не удалось или файл не существует
function ExtractFile-Ext(const FileName: string): string; Функция возвращает расширение файла
function ExtractFileName(const FileName:string): string; Извлекает имя и расширение файла, переданного в параметре FileName
function ExtractFilePathfconst FileName: string): string; Функция возвращает полный путь к файлу
procedure Erase(var F); Удаляет файл, связанный с файловой переменной F
function FileSearch(const Name, DirL ist: string): string; Данная процедура производит поиск в каталогах DirList файла Name. Если в процессе выполнения FileSearch обнаруживается искомое имя файла, то функция возвращает в строке типа String пол ный путь к найденному файлу. Если файл не найден, то возвращается пустая строка
Function FileSetAttr(const FileName: string; Attr: Integer): Integer; Присваивает файлу с именем FileName атрибуты Attr. Функция возвращает 0, если присвоение атрибутов прошло успешно. В противном случае возвращается код ошибки
function FilePos(var F): Longint; Возвращает текущую позицию в файле. Функция используется для нетекстовых файлов. Перед вызовом FilePos файл должен быть открыт
function FileSize(var F): Integer; FileSize возвращает размер файла в байтах или количество записей в файле, содержащем записи. Перед вызовом данной функции файл должен быть открыт. Для текстовых файлов функция FileSize не используется.
procedure Flush(var F: Text); Процедура очищает буфер текстового файла открытого для записи. F — файловая переменная. Когда текстовый файл открыт для записи с использованием функций Rewrite или Append, Flush очищает выходной буфер, связанный с файлом. После выполнения данной процедуры все символы, которые направлены для записи в файл, будут гарантированно записаны в нем.
procedure GetDir(D: Byte; var S: strings); Возвращает число, соответствующее диску, на котором содержится текущий каталог s D может принимать одно из следующих значений: 0—по умолчанию (текущий), 1 — А, 2 — В, 3 — C и так далее. Процедура не генерирует код ошибки. Если имя диска Х в D оказывается ошибочным, то в строке S возвращается значение Х:\ как если бы текущая директория была на этом ошибочно указанном диске
function IOResult: Integer; Функция возвращает статус последней произведенной операции ввода/вывода, если контроль ошибок выключен {$I-}
procedure MkDir(S: string); Процедура создает новый каталог, который описывается в строке S
procedure Rename(var F; NewName: string); Процедура изменяет имя файла, связанного с файловой переменной F. Переменная NewName является строкой типа string или типа pchar (если включена поддержка расширенного синтаксиса)
procedurе RmDir (S: string); Процедура удаляет пустой каталог, путь к которому задается в строке S. Если указанный каталог не существует или он не пустой, то возникает сообщение об ошибке ввода/вывода
procedure Seek (var F; N: Longint); Перемещает текущую позицию курсора на N позиций. Данная процедура используется только для открытых типизированных или не типизированных файлов для проведения чтения-записи с нужной позиции файла. Началу файла соответствует нулевой номер позиции. Для добавления новой информации в конец существующего файла, необходимо установить указатель на символ, следующий за последним. Для этого можно использовать выражение Seek (F, FileSize(F))
function SeekEof[(var F: Text)]: Boolean; Возвращает значение True, если указатель текущей позиции находится на символе конца файла. SeekEof может быть использована только с открытым текстовым файлом
function SeekEoln [(var F: Text)]: Boolean; Возвращает значение True, если указатель текущей позиции находится на символе конца строки. SeekEoln может быть использована только с открытым текстовым файлом
procedure SetTextBuf(var F: Text; var Buf [; Size: Integer]); Накапливаются данные при чтении и записи. Такой буфер пригоден для большинства операций. Однако при выполнении программ с интенсивным вводом/выводом, буфер может переполниться, что приведет к записи операций ввода/вывода на диск и, как следствие, к существенному замедлению работы приложения. SetTextBuf позволяет помещать в текстовый файл F информацию об операциях ввода/вывода вместо ее размещения в буфере, Size указывает размер буфера в байтах. Если этот параметр опускается, то полагается размер, равный SizeOf (Buf). Новый буфер действует до тех пор, пока F не будет связана с новым файлом процедурой AssignFile.
procedure Truncate (var F); Удаляет все позиции, следующие после текущей позиции в файле. А текущая позиция становится концом файла. С переменной F может быть связан файл любого типа, за исключением текстового

Пример:

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

Перед выводом в файл его необходимо открыть. Возможно, что файл с результатами работы программы уже есть на диске. Поэтому нужно решить, как поступить со старым файлом: заменить старые данные новыми или новые данные добавить к старым.

Возможны следующие режимы открытия файла для записи в него данных:

· перезапись (запись нового файла с уничтожением старого или просто создание нового файла);

· добавление в существующий файл.

Для открытия файла в режиме создания нового файла или замены существующего используется процедура ReWrite(F), где F — файловая переменная типа TextFile. Для добавления новых данных применяют процедуру Append(F),где F — файловая переменная типа TextFile.

На форме проекта помещаются четыре компонента: Edit, Memo и две кнопки.

Имя файла нужно ввести во время работы в поле Edit1. Можно задать имя файла во время разработки формы приложения.

procedure TForm1.Button1Click(Sender: TObject);

var

f: TextFile; //объявление файловой переменной

fName: String[80]; //имя файла

i: integer;

begin

fName:= Edit1.Text;

AssignFile(f, fName);

Rewrite(f); //открыть для перезаписи

//запись в файл

for i:=0 to Memo1.Lines.Count do

writeln(f, Memo1.Lines[i]);

CloseFile(f); // закрытьфайл

MessageDlg('Данные записаны в файл', mtInformation, [mbOk],0);

end;

procedure TForm1.Button2Click(Sender: TObject);

var

f: TextFile; // ôàéë

fName: String[80]; // имя файла

i: integer;

begin

fName:= Edit1.Text;

AssignFile(f, fName);

Append(f); //Открыть для добавления

for i:=0 to Memo1.Lines.Count do

writeln(f, Memo1.Lines[i]);

CloseFile(f); // закрыть файл

MessageDlg('Данные добавлены в файл', mtInformation, [mbOk], 0);

end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: