Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическая работа N10.doc
Скачиваний:
3
Добавлен:
08.09.2019
Размер:
208.9 Кб
Скачать

1.5 Закрытие файла

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

CloseFile(f);

1.6 Пример работы с текстовым файлом

Расположите на форме компоненты Memo, Button, OpenDialog, SaveDialog в соответствии с рисунком:

Создайте обработчик события нажатия на кнопку «Записать» следующего содержания:

var

filename:string;

begin

if SaveDialog1.Execute then

begin

filename:=SaveDialog1.FileName;

Memo1.Lines.SaveToFile(filename);

end;

end;

Создайте обработчик события нажатия на кнопку «Открыть» следующего содержания:

var

filename:string;

begin

if OpenDialog1.Execute then

begin

if FileExists(filename) then begin

filename:=OpenDialog1.FileName;

Memo1.Lines.LoadFromFile(filename);

end;

end;

end;

Создайте обработчик события нажатия на кнопку «Закрыть» следующего содержания:

begin

Form1.Close;

end;

2 Нетипизированные файлы

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

2.1 Объявление

Объявление нетипизированной файловой переменной происходит следующим образом:

f : File;

2.2 Связывание переменной с файлом

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

AssignFile(f, 'filename’);

После вызова этой функции, мы можем обращаться с переменной f как с файлом filename.

2.3 Открытие файла

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

Reset открывает файл только для чтения. Все попытки изменить такой файл приведут к ошибке.

При открытии файла указатель (курсор) устанавливается на начало файла. Эта функция работает немного по- разному с разными типами файлов. В случае нетипизированного файла, функция Reset имеет два параметра – файловую переменную и длину записи в байтах. Например – 1 байт. Так удобней для обработки кода.

Reset(f, 1);

Rewrite имеет такие же параметры, что и Reset, но она открывает файл для записи. Причем если файла нет, то он создается, а если есть – перезаписывается. Указатель также устанавливается в первую позицию.

Rewrite(f, 1);

2.4 Запись в файл. Чтение из файла

А вот дальше идет интересная функция BlockRead. Она предназначена для работы только с нетипизированными файлами, для работы с файлами другого типа используют функцию Read и Readln.

Функция BlockRead считывает информацию сразу блоками, что значительно ускоряет процесс копирования файлов. Эта функция имеет четыре параметра, причем последний необязателен.

BlockRead(F, Buf, Size, Result);

Разберемся с этими параметрами.

F- Переменная файлового типа, ранее связанная с файлом функцией AssignFile().

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

Size - Количество байт, которые нужно прочитать.

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

Работает эта процедура следующим образом: из файла F считывается Size записей, которые помещаются в память, начиная с первого байта переменной Buf. После выполнения процедуры реальное количество прочитанных байт помещается в переменную Result. Здесь надо сказать, что эта переменная совсем не обязательно должна присутствовать в качестве параметра, то есть ее попросту можно опустить. Однако иногда она довольно полезна и даже необходима - например, если чтение было окончено до того, как было прочитано требуемое количество байт (достигнут конец файла), мы можем это отследить через переменную Result.

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

BlockWrite(F, Buf, Size, Result)

F- переменная типа File;

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

Size- количество записываемого блока данных в байтах.

Result - в эту переменную помещается реальное количество байт, которые были записаны.

Как видите, сходство с BlockRead действительно имеется. Здесь все абсолютно аналогично предыдущей процедуре.