Потоци 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

СъобщениеОписание
имот Позиция: Лонгинт;Получава текущата позиция в потока
имот Размер: Longint;Указва размера на потока в байтове
функция CopyFrom(Източник: TStream; Брой: Longint) : Longint;Копира байтове от потока SourceCount, започвайки от текущата позиция. Връща броя на копираните байтове
функция Read(var Buffer; Count: Longint) : Longint; виртуален; абстрактно;Абстрактен клас, който се отменя в наследниците. Чете байтове от потока Count в буфер. Връща броя на копираните байтове
процедура Read3uffer (var Buffer; Count: Longint) ;Чете байтове от потока Count в буфер. Връща броя на копираните байтове
функция Търсене (Изключено: Longint; Произход: Word): Longint; виртуален; абстрактно;Абстрактен клас, който се отменя в наследниците. Измества текущата позиция в реалния носител за съхранение с отместени байтове в зависимост от условието за произход
функция Write(const Buffer; Count: Longint): Longint; виртуален; абстрактно;Абстрактен клас, който се отменя в наследниците. Записва байтове от буфера в потока за броене. Връща броя на копираните байтове
процедура WriteBuffer(const буфер; брой: Longint);Записва байтове от буфера в потока за броене. Връща броя на копираните байтове
функция ReadComponent(Екземпляр: TComponent): TComponent;Предава данни от потока към компонента на екземпляра, като попълва неговите свойства със стойности
функция ReadComponentRes(Екземпляр: TComponent) : TComponent;Чете заглавката на ресурса на компонента на екземпляра и стойностите на неговите свойства от потока.
процедураReadResHeader;Чете заглавието на ресурса на компонента от потока
процедура WriteComponent(Екземпляр: TComponent) ;Предава стойностите на свойствата на компонента Instance към потока
процедура WriteComponentRes(const ResName: низ; Екземпляр: TComponent) ;Записва заглавката на ресурса на компонента на екземпляра и стойностите на неговите свойства в потока

И така, операциите за четене и запис на данни в поток се основават на методите за четене и запис. Те се извикват, за да изпълнят действително операцията вътре в методите ReadBuffer и WriteBuffer, ReadComponent и WriteComponent. Тъй като класът TStream е абстрактен, методите Read и write също са абстрактни. В наследствените класове те се припокриват, осигурявайки работа със специфичен физически носител за съхранение.

Листинг 1 - създаване, четене и писане на поток

Поток: TStream; //Декларация на нишка

Поток := TMemoryStream.Create(.); //Създаване на нишка

Поточно четене (. ); //Четене на данни от потока

Поточно записване (. ); //Запис на данни в потока

Безплатно предаване; //Изчистване на потока

Група от методи осигурява четене и запис от ресурсния поток на компонента. Те се използват при създаване на компонент въз основа на неговите данни, записани във формат на ресурсния файл. За четене на ресурс се използва методът ReadComponentRes, при който се извикват последователно: методът ReadResHeader - за четене на хедъра на ресурса на компонента от потока; метод ReadComponent - за четене на стойностите на свойствата на компонента. Методът writeComponentRes се използва за запис на ресурс в поток.

2. Поток TFileStream

Обектът TFileStream е наследник на основния обект TStream и позволява достъп до диска, както и създаване на поток за работа с файлове. ПриВ този случай потокът работи с файла, независимо от вида на данните, съхранявани в него.

Пълното име на файла, който ще се отваря, е посочено в параметъра FileName. Този параметър е прост низ:

конструктор Create(const FileName: string; Mode: Word);

Параметърът Mode определя режима на работа с файла. Състои се от флагове за отворен режим: fmCreate - файлът се създава; fmOpenRead - файлът се отваря за четене; fmopenwrite - файлът се отваря за запис; fmOpenReadWrite - Файлът се отваря за четене и запис.

И флагове за режим на споделяне:

fmShareExciusive - файлът не е достъпен за отваряне от други приложения;

fmShareDenyRead - други приложения могат да записват данни във файла;

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

Нека разгледаме по-отблизо методите за четене, запис и вътрешната структура на файла. Да започнем със структурата. Когато отворите файл, позицията на курсора е зададена в самото начало и всеки опит за четене или запис ще се извърши в тази позиция на курсора. Ако трябва да четете или пишете на друга позиция, трябва да преместите курсора. За това се използва методът Seek. "Референтната точка" на позицията зависи от стойността на параметъра

Origin: soFromBeginning - отместването трябва да е положително и да се брои от началото на потока;

soFromCurrent - отместване спрямо текущата позиция в потока;

soFromEnd - Отместването трябва да е отрицателно и да се брои от края на потока.

Не забравяйте, че един байт е един знак. Единственото изключение са Unicode файловете. При тях един знак заема 2 байта.

Следователно е необходимо да се вземе предвид под каква форма се съхранява информацията във файла.

Така че, акотрябва да преместите 10 знака от началото на файла, можете да напишете следния код:

Методът за търсене винаги връща отместването на курсора от началото на файла. Можете да използвате това, за да разберете къде сме сега, или можете да разберете общия размер на файла. Ако се придвижите до края на файла, функцията ще върне броя байтове от началото до края, т.е. общия размер на файла.

Следващият пример задава позицията във файла на 0 байта от края, тоест до самия край. Това дава общия размер на файла:

Размер на файла := Stream.Seek(0, soFromEnd);

За да прочетете от файл, използвайте метода Read. Този метод има два параметъра:

1. Променлива, в която ще бъде записан резултатът от четенето;

2. Броят байтове за четене.

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

Списък 2 - Четене от файл, започвайки от позиция 20.

начало // След това отворете файла “Sample.wrk”. Поток:= TFileStream.Create('c:\Sample.wrk, fmOpenReadWrite); Търсене на поток (20, soFromBeginning); // Преместване с 20 знака напред. Поточно четене (buf, 5); // Прочетете 5 знака от зададената позиция. Безплатно предаване; // Изчистване на потока.

Ако не са възникнали проблеми, това число трябва да е равно на броя байтове, поискани за четене. Има само два случая, в които тези числа се различават:

1. При четене е достигнат краят на файла и по-нататъшното четене става невъзможно;

2. Грешка в диска или друг проблем.

Методът на запис се използва за четене. Има две опции:

1. Променлива, чието съдържание трябва да бъде написано;

2. Броят байтове за запис.

Можете да използвате този метод по същия начин като метода за четене.

3. Поток TMemoryStream

ЗаЗа да създадете TMemoryStream, използвайте конструктора Create без параметри:

За да прочетете информация от файл и едновременно да я запишете в потока, използвайте метода LoadFromFile:

Процедура LoadFromFile(const FileName: string);

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

И подобен метод за запис на съдържанието на потока във файл:

Процедура SaveToFile(const FileName: string);

метод за четене на информация от друг поток, независимо от неговия тип, както и метод за запис на съхранена информация в друг поток:

Load ProcedureFromStream(Поток: TStream);

Запазете ProcedureToStream(Поток: TStream);

Също така, за нишки, работещи с RAM, е дефинирано

операцията по изчистване на съдържанието чрез метода Clear:

Описаните по-горе потоци играят голяма роля при създаването на проекти за работа с файлове и информация, а също така са неразделна част при работа с файлова структура. Разработеното приложение отразява основните функции на потоците TFileStream и TmemoryStream, демонстрира как да четете / записвате файлове с помощта на тези потоци. Смятам, че в теоретичната част на курса темата за потоците е напълно разкрита и предоставя цялата необходима информация за тяхното използване.