Южно-Сахалинский институт экономики, права иинформатики
Кафедра КТиСПояснительная записка ккурсовой работе
по дисциплине: Языки программирования и методытрансляции
на тему: Потоки: 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. ПотокTFileStream
Объект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. ПотокTMemoryStream
КлассTMemoryStream обеспечивает сохранение данных в адресном пространстве. При этомметоды доступа к этим данным остаются теми же, что и при работе с файловымипотоками. Это позволяет использовать адресное пространство для храненияпромежуточных результатов работы приложения, а также при помощи стандартныхметодов осуществлять обмен данными между памятью и другими физическиминосителями.
Длясоздания потока TMemoryStream используется конструктор Create без параметров:
ConstructorCreate;
Длячтения информации из файла с одновременным занесением ее в поток используетсяметод LoadFromFile:
Procedure LoadFromFile(const FileName: string);
файл поток класс метод
Ианалогичный метод для записи содержимого потока в файл:
Procedure SaveToFile(const FileName: string);
методдля чтения информации из другого потока вне зависимости от его типа, а такжеметод записи хранимой информации в другой поток:
Procedure LoadFromStream(Stream: TStream);
Procedure SaveToStream(Stream: TStream);
Также,для потоков, работающих с оперативной памятью, определена
операцияочистки содержимого с помощью метода Clear:
ProcedureClear;
Заключение
Потоки,описанные выше играют большую роль при создании проектов для работы с файлами иинформацией, а так же являются неотъемлемой частью при работе с файловойструктурой. Разработанное приложение отражает основные функции потоков TFileStream и TmemoryStream, демонстрируетспособы чтения/записи файлов с помощью данных потоков. Я считаю что втеоретической части курсовой тема потоков раскрыта полностью и предоставляетвсю необходимую информацию для их использования.
Списокиспользованных источников
1. М. Фленов Библия Delphi/ М.Е.Флеонов-СПб.: БХВ-Петербург, 2007. -880с.
2. Http://proclub.ru –Клубпрограммистов.
3. Http://life-prog.ru–Языки программирования.
4. Http://Delphimaster.ru- Мастера DELPHI
5. www.delphi.3dn.ru — Архив материалов — Всё о delphi
6. www.delphiplus.org
- Новости о языке программирования
7. http:// www.delphiexpert.ru– Материал о Delphi
8. http:// delphiworld.narod.ru- Материал о Delphi
9. http:// www.delphirus.com — Материал о Delphi
10. http:// www.delphibasics.ru — Справочник — «Основы Delphi»
Приложение
В ходевыполнения курсовой работы было создано программное приложение «Streams.exe».
Рисунок1- Интерфейс программы Streams.exe
/>