Delphi. Объектная модель обращения к файлу.

Вернуться назад.

Класс TfileStreem.

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

При объектной модели взаимодействие осуществляется по схеме файл поток, имеющий тип TfileStreem.

Далее обращение к данным производится через методы потока.

Создание потока.

Constructor create(const FileName:string; mode:word);

FileName – имя файла, содержимое которого будет отображено в поток.

Mode — режим создания потока:
fmCreate – создаётся файл и связанный с ним поток.
fmOpenRead — создается поток, файл открывается для чтения;
fmOpenWrite — создается поток, файл открывается для записи;
fmOpenReadWrite — создается поток, файл открывается для чтения и записи;

Методы класса TfileStream.

Метод TfileStream.Create(‘имя_файла’, режим_создания_потока)

Метод, в зависимости от значения «режим_создания_потока«, выполняет:
— если файл не существует, то создаётся файл и с ним ассоциируется создаваемый поток;
— если файл существует, то создаётся поток, в который можно записывать данные или читать из него.

Если данные записать в поток, то они автоматически попадают в файл.

Метод seek(количество_байт,откуда);

количество_байт — на какое количество байт переместить указатель в потоке по отношению к позиции «откуда»

откуда — может иметь значения:
soFromBeginning — отсчитывать от начала потока к его концу;
soFromEnd — отсчитывать от конца потока в направлении начала;
soFromCurrent — отсчитывать от текущей позиции к концу потока.

Метод ReadBuffer(буфер_куда_читать, сколько_байт_записать в_буфер);

Метод для чтения данных их файла в буфер.

Буфер_куда_читать — это простая или структурированная переменная (например, массив).

В любом случае для правильной интерпретации считанных из потока данных необходимо знать структуру записанных в файл данных. Например, если записаны данные типа «byte», то читать из потока надо по одному байту и записывать эти байты в переменную соответствующего типа. Если же в файле были записаны данные типа «Integer», то надо считывать по 4 байта и передавать их переменной типа «Integer», так как длина этой переменной 4 байта.

Сколько_байт_записать в_буфер — Метод ReadBuffer считывает из файла и размещает в потоке столько байт, сколько указано в параметре «сколько_байт_записать в_буфер».

Метод WriteBuffer(буфер_откуда_читать, сколько_байт_записать в_буфер);

Метод для записи данных из буфера в файл.

Буфер_откуда_читать — переменная, значение (или значения) из которой будут записаны в поток и, соответственно, в файл.

Сколько_байт_записать в_буфер — если мы, например, записываем данные из массива, то можно указать или всю длину массива, или только часть байт, которую надо записать.

ПРИМЕРЫ РАБОТЫ С ФАЙЛОМ ЧЕРЕЗ ПОТОК

СОЗДАТЬ ФАЙЛ из 10 целых чисел.

procedure TForm1.Button1Click(Sender: TObject);
var f:file of integer; //типизированный файл
i,ii:integer;
begin
assignFile(f,’myFile.int’);
reWrite(f);//создать файл
for i:=1 to 10 do
begin
ii:=i*10;
write(f,ii);//записать данные
end;
closeFile(f);
end;

ПРОЧИТАТЬ ДАННЫЕ ИЗ ФАЙЛА

procedure TForm1.Button4Click(Sender: TObject);
var ar_i:array[1..10] of integer;
i:integer;
begin
FileStream1:=TFileStream.Create(‘myFile.int’,fmOpenRead);//создать поток и открыть файл для чтения
FileStream1.ReadBuffer(ar_i,10*sizeOf(Integer));//читаем из потока 40 байт в в буфер ar_i
for i:=1 to 10 do
self.ListBox1.Items.Add(intToStr(ar_i[i]));
end;
FileStream1.Free;//закрываем поток
end;

В результате будем иметь:

ПРОЧИТАТЬ ТРЕТЬЕ ЧИСЛО

Третье число начинается с 8-го байта, поэтому позиционируем поток на 8-ой байт:

procedure TForm1.Button8Click(Sender: TObject);
var i:integer;
begin
Stream1.Seek(8,soFromBeginning);// перемещаем указатель в потоке на восемь байт, отсчитывая от начала потока (на то, что отсчёт ведётся от начала потока, указывает параметр soFromBeginning).
Stream1.ReadBuffer(i,4);//читаем 4 байта из потока в переменную i
self.Edit1.Text:=inttostr(i);
Stream1.Free;//закрываем поток
end;

ЗАПИСАТЬ ЧИСЛО В КОНЕЦ ФАЙЛА

procedure TForm1.Button6Click(Sender: TObject);
var i:integer; ar_i:array[1..11] of integer;
begin
i:=110;
FileStream1:=TFileStream.Create(‘myFile.int’,fmOpenWrite);//открыть файл на запись
FileStream1.Seek(0,soFromEnd);//установить указатель в конец потока и передвинуть его влево на 0
//байт.
FileStream1.WriteBuffer(i,sizeOf(Integer));//записать из буфера i 4-е байта в поток (и, соответственно, в //файл).
FileStream1.Free;//

FileStream1:=TFileStream.Create(‘myFile.int’,fmOpenRead);//открыть поток на чтение
FileStream1.ReadBuffer(ar_i,11*sizeOf(Integer));//читаем 11*4 байт в буфер ar_i
for i:=1 to 11 do
self.ListBox3.Items.Add(intToStr(ar_i[i]));
FileStream1.Free;//
end;

ЗАПИСАТЬ ЧИСЛО В ЧЕТВЁРТУЮ ПОЗИЦИЮ.

procedure TForm1.Button5Click(Sender: TObject);
var i:integer; ar_i:array[1..10] of integer;
begin
i:=45;
FileStream1:=TFileStream.Create(‘myFile.int’,fmOpenWrite);//создать поток и открыть файл для записи
FileStream1.Seek(12,soFromBeginning);//позиционировать указатель в потоке на 12-ю позицию от
//начала потока
FileStream1.WriteBuffer(i,sizeOf(Integer));//записать в эту позицию 4 байта (старые значения будут
//затёрты)
FileStream1.Free;
FileStream1:=TFileStream.Create(‘myFile.int’,fmOpenRead);
FileStream1.ReadBuffer(ar_i,10*sizeOf(Integer));//читаем все значения из файла
for i:=1 to 10 do
self.ListBox2.Items.Add(intToStr(ar_i[i]));
FileStream1.Free;
end;

Вернуться назад.

***

Обновлено: 19.02.2022 — 22:09