Главная > Информатика, программирование > Потоки TStream, TFileStream, TMemoryStream

Потоки TStream, TFileStream, TMemoryStream


25-01-2012, 11:04. Разместил: tester1

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

Кафедра КТіС

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

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

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

Південно-Сахалінськ

2010


Введення

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

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

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

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

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

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

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

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

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


1. Потік TStream

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

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

Оголошення Опис property Position: Longint; Визначає поточну позицію в потоці property Size: Longint; Визначає розмір потоку в байтах function CopyFrom ( Source: TStream; Count: Longint): Longint; Копіює з потоку Source Count байти, починаючи з поточної позиції. Повертає число скопійованих байтів 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 і значення його властивостей з потоку. procedure ReadResHeader; Зчитує заголовок ресурсу компонента з потоку procedure WriteComponent (Instance: TComponent); Передає в потік значення властивостей компонента Instance procedure WriteComponentRes (const ResName: string; Instance: TComponent); Записує в потік заголовок ресурсу компонента Instance і значення його властивостей

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

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

Var

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

Begin

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

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

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

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

End;

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


2. Потік T FileStream

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

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

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

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

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

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

fmShareDenyWrite - Інші програми можуть читати дані з файлу;

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

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

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

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

soFromCurrent - Зсув щодо поточної позиції в потоці;

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

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

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

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

Stream.Seek (10, SoFromBeginning);

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

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

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

Для читання з файлу потрібно використовувати метод Read. У цього методу два параметри:

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

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

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

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

Var Stream: TFileStream;// Змінна типу об'єкт TFileStream. buf: array [0 .. 10] of char;// Буфер для зберігання прочитаних даних

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

end;

Метод Read повертає кількість реально прочитаних байт (символів).

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

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

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

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

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

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

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

3. Потік T MemoryStream

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

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

Constructor Create;

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

Procedure LoadFromFile (const FileName: string);

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

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

Procedure SaveToFile (const FileName: string);

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

Procedure LoadFromStream (Stream: TStream);

Procedure SaveToStream (Stream: TStream);

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

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

Procedure Clear;


Висновок

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


Список використаних джерел

1. М. Флен Біблія Delphi/М.Є. Флеонов-СПб.: БХВ-Петербург, 2007. -880с.

2. Http ://proclub.ru-Клуб програмістів.

3. Http ://life-prog.ru -Мови програмування.

4. Http ://Delphimaster.ru - Майстри DELPHI

5. .delphi.3dn.ru - Архів матеріалів - Все про delphi

6. .delphiplus.org - Новини про мову програмування

7. www.delphiexpert.ru - Матеріал про Delphi

8. delphiworld.narod.ru - Матеріал про Delphi

9. www.delphirus.com - Матеріал про Delphi

10. www.delphibasics.ru - Довідник - "Основи Delphi"


Додаток

В ході виконання курсової роботи було створено програмний додаток В«Streams.exeВ».

Малюнок 1 - Інтерфейс програми Streams.exe