Потоки TStream, TFileStream, TMemoryStream

Південно-Сахалінський інститут економіки, права та інформатики

Пояснювальна записка до курсової роботи

з дисципліни: Мови програмування та методи трансляції

на тему: Потоки: TStream, TFileStream, TMemoryStream

Завданням курсової є реалізація програми для роботи з файловою структурою операційної системи Windows. Для реалізації програми потрібно використовувати інтегроване середовище розробки Delphi7.

Мета роботи – вивчити принципи програмування файлової структури в операційній системі Windows та створити програму для роботи з потоками TStream, TFileStream та TMemoryStream. У проекті передбачається реалізувати основні операції над потоками, такі як читання, запис, видалення та редагування.

Система, що розробляється, виконує наступні функції:

1. дозволяє створювати потоки TFileStream, TMemoryStream,

2. збереження даних у файли,

3. відкриття та редагування файлів за допомогою потоків,

4. використовувати дані з файлів у програмі.

Для розробки програми використовуються такі програмні інструменти:

1. середа розробки Delphi 7

У основі ієрархії класів потоків лежить клас Tstream. Він забезпечує виконання основних операцій потоку безвідносно реальному носію інформації. Основними з них є читання та запис даних. Клас Tstream породжений безпосередньо від класу TObject. Потоки також відіграють важливу роль у читанні/записі компонентів файлів ресурсів (DFM). Велика група методів забезпечує взаємодію компонента та потоку, читання властивостей компонента з ресурсу та запис значень властивостей у ресурс.

Таблиця 1 - Властивості та методи класу Tstream

ОголошенняОпис
properties Position: Longint;Визначає поточну позицію у потоці
property Size: Longint;Визначає розмір потоку в байтах
function CopyFrom( Source: TStream; Count: Longint) : Longint;Копіює з потоку SourceCount байти, починаючи з поточної позиції. Повертає кількість скопійованих байтів
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;Анотація клас перекривається в спадкоємців. Зчитує з потоку Count байти буфер Buffer. Повертає кількість скопійованих байтів
procedure Read3uffer (var Buffer; Count: Longint);Зчитує з потоку Count байти буфер Buffer. Повертає кількість скопійованих байтів
function Seek (Off set: Longint; Origin: Word): Longint; virtual; abstract;Анотація клас перекривається в спадкоємців. Зміщує поточну позицію в реальному носії даних на байтах Offset в залежності від умови Origin
function Write (const Buffer; Count: Longint): Longint; virtual; abstract;Анотація клас перекривається в спадкоємців. Записує в потік Count байти з буфера Buffer. Повертає кількість скопійованих байтів
procedure WriteBuffer (const Buffer; Count: Longint);Записує в потік Count байти з буфера Buffer. Повертає кількість скопійованих байтів
function ReadComponent (Instance: TComponent): TComponent;Передає дані з потоку компонент instance, заповнюючи його властивості значеннями
function ReadComponentRes (Instance: TComponent) : TComponent;Зчитує заголовок ресурсу компонента Instance та значення його властивостей із потоку.
procedureReadResHeader;Зчитує заголовок ресурсу компонента з потоку
procedure WriteComponent (Instance: TComponent) ;Передає значення властивостей компонента Instance в потік.
procedure WriteComponentRes (const ResName: string; Instance: TComponent) ;Записує в потік заголовок ресурсу компонента Instance та значення його властивостей

Отже, в основі операцій зчитування та запису даних у потоці лежать методи Read та Write. Саме вони викликаються для реального виконання операції усередині методів ReadBuffer та WriteBuffer, ReadComponent та WriteComponent. Так як клас TStream є абстрактним, то методи Read та write також є абстрактними. У класах-спадкоємцях вони перекриваються, забезпечуючи роботу з конкретним фізичним носієм даних.

Лістинг 1 - створення, читання та запис потоку

Stream: TStream; //Оголошення потоку

Stream := TMemoryStream.Create (. ); //Створення потоку

Stream.Read(. ); //Читання даних із потоку

Stream.Write(. ); //Запис даних у потік

Stream.Free; //Очистити потік

Група методів забезпечує читання та запис із потоку ресурсу компонента. Вони використовуються для створення компонента на основі даних про нього, збережених у форматі файлів ресурсів. Для читання ресурсу використовується метод ReadComponentRes, у якому послідовно викликаються: метод ReadResHeader - для зчитування заголовка ресурсу компонента потоку; метод ReadComponent – ​​для зчитування значень властивостей компонента. Для запису ресурсу в потік застосовується метод writeComponentRes.

2. Потік TFileStream

Об'єкт TFileStream є нащадком головного об'єкта TStream і дозволяє отримати доступ до диска, а також створити потік для роботи з файлами. Прицьому потік працює з файлом без урахування типу даних, що зберігаються в ньому.

Повне ім'я файлу, який потрібно відкрити, задається у параметрі FileName. Цей параметр - проста рядок:

constructor Create (const FileName: string; Mode: Word);

Параметр Mode визначає режим роботи із файлом. Він складається із прапорів режиму відкриття: fmCreate - файл створюється; fmOpenRead - файл відкривається для читання; fmopenwrite - файл відкривається для запису; fmOpenReadWrite - файл відкривається для читання та запису.

І прапори режиму спільного використання:

fmShareExciusive - файл недоступний для відкриття іншими програмами;

fmShareDenyRead - інші програми можуть писати дані у файл;

fmShareDenyNone — інші програми можуть виконувати будь-які операції з файлом. Створення потоку аналогічно прикладу, розглянутому у лістингу 1.

Докладніше ознайомимося з методами читання, запису та внутрішньою структурою файлу. Почнемо зі структури. Коли ви відкрили файл, позиція курсору встановлюється на початок і будь-яка спроба читання або запису буде відбуватися в цю позицію курсора. Якщо вам треба прочитати чи записати в будь-яку іншу позицію, то треба пересунути курсор. Для цього використовується метод Seek. "Точка відліку" позиції залежить від значення параметра

Origin: soFromBeginning - зміщення має бути позитивним і відраховується від початого потоку;

soFromCurrent - зміщення щодо поточної позиції в потоці;

soFromEnd - зсув має бути негативним і відлічується від кінця потоку.

Не забувайте, що один байт – це один символ. Єдиний виняток – файли у форматі Unicode. Вони один символ займає 2 байти.

Отже, треба враховувати, у вигляді зберігається інформація у файлі.

Отже, якщовам треба пересунутись на 10 символів від початку файлу, можете написати наступний код:

Метод seek завжди повертає зміщення курсору з початку файла. Цим можна скористатися, щоб дізнатися, де ми зараз знаходимося, а можна дізнатися загальний розмір файлу. Якщо переміститися в кінець файлу, функція поверне кількість байт від початку до кінця, тобто повний розмір файлу.

У наступному прикладі встановлюється позиція у файлі на 0 байт від кінця, тобто в кінець. Тим самим виходить повний розмір файлу:

Розмір файлу: = Stream.Seek(0, soFromEnd);

Для читання файлу потрібно використовувати метод Read. Цей метод має два параметри:

1. Змінна, в яку буде записано результат читання;

2. Кількість байт, які треба прочитати.

У лістингу 2 розглянемо приклад читання з файлу з 20 позиції

Лістинг 2 – Читання з файлу, починаючи з 20 позиції.

begin // Далі відкриваємо файл "Sample.wrk". Stream:= TFileStream.Create('c:\Sample.wrk, fmOpenReadWrite); Stream.Seek(20, soFromBeginning); // Переміщення на 20 символів вперед. Stream.Read(buf, 5); // Читання 5 символів із встановленої позиції. Stream.Free; // Очищення потоку.

Якщо не сталося жодних проблем, то це число має дорівнювати кількості запрошених для читання байт. Є лише два випадки, коли ці числа відрізняються:

1. Під час читання було досягнуто кінець файлу і подальше читання стало неможливим;

2. Помилка на диску чи будь-яка інша проблема.

Для читання застосовується метод write. У нього два параметри:

1. Змінна, вміст якої слід записати;

2. Число байт для запису.

Користуватися цим методом можна так само як і методом для читання.

3. Потік TMemoryStream

Длястворення потоку TMemoryStream використовується конструктор Create без параметрів:

Для читання інформації з файлу з одночасним занесенням її в потік використовується метод LoadFromFile:

Procedure LoadFromFile(const FileName: string);

файл потік клас метод

І аналогічний метод для запису вмісту потоку у файл:

Procedure SaveToFile(const FileName: string);

метод для читання інформації з іншого потоку незалежно від його типу, а також метод запису інформації, що зберігається в інший потік:

Procedure LoadFromStream(Stream: TStream);

Procedure SaveToStream(Stream: TStream);

Також, для потоків, що працюють з оперативною пам'яттю, визначено

операція очищення вмісту за допомогою методу Clear:

Потоки, описані вище, відіграють велику роль при створенні проектів для роботи з файлами та інформацією, а також є невід'ємною частиною при роботі з файловою структурою. Розроблений додаток відображає основні функції потоків TFileStream і TmemoryStream, демонструє способи читання/запису файлів за допомогою даних потоків. Я вважаю, що в теоретичній частині курсової тема потоків розкрита повністю і надає всю необхідну інформацію для їх використання.