- •Практическая работа 10 Работа с файлами.
- •1 Текстовые файлы
- •1.1 Объявление
- •1.2 Связывание переменной с файлом
- •1.3 Открытие файла
- •1.4 Запись в файл. Чтение из файла
- •1.4.1 Текстовый файл и компонент Memo
- •1.5 Закрытие файла
- •1.6 Пример работы с текстовым файлом
- •2 Нетипизированные файлы
- •2.1 Объявление
- •2.2 Связывание переменной с файлом
- •2.3 Открытие файла
- •2.4 Запись в файл. Чтение из файла
- •2.5 Закрытие файла
- •2.6 Дополнительные функции и процедуры
- •2.7 Пример работы с нетипизированным файлом
- •3 Типизированные файлы
- •3.1 Объявление
- •3.2 Связывание переменной с файлом
- •3.3 Открытие файла
- •3.4 Работа с файлом
- •3.5 Закрытие файла
- •3.6 Пример работы с типизированным файлом
- •4 Ini файлы
- •4.1 Объявление
- •4.2 Создание/подключение
- •4.3 Чтение-запись
- •Ini.WriteInteger('Position', 't', Form1.Top);
- •4.4 Закрытие файла
- •4.5 Пример работы с ini-файлом.
- •5 TFileStream
- •5.1Объявление и инициализация переменной.
- •5.2 Работа с файлом
- •5.3 Закрытие
- •5.4 Пример
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 действительно имеется. Здесь все абсолютно аналогично предыдущей процедуре.