Добавил:
ikot.chulakov@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Delphi с готовыми программами / Лабораторная работа №11 Классы, методы, свойства.pdf
Скачиваний:
42
Добавлен:
12.07.2020
Размер:
708.22 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

begin

write('filename > '); readln(FileName);

List:=TStringList.Create;

List.LoadFromFile(FileName);

for i:=0 to List.Count-1 do writeln(List.Strings[i]);

List.Free;

writeln('Press Enter to Exit'); readln;

end.

Потоковый ввод-вывод класс TStream

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

Класс TStream является базовым классом для потоков разных типов. В этом классе реализованы все необходимые свойства и методы, необходимые для чтения и записи данных на различные типы носителей (память, диск, медиа носители). Благодаря этому классу, доступ к разным типам носителей становиться одинаковым. Класс TStream является абстрактным и поэтому объекты этого класса никогда напрямую не используются. Используются потомки этого класса, например, класс TFileStream является потомком базового класса TStream и позволяет получить доступ к диску. Точно так же можно получить доступ:

к памяти через класс TMemoryStream.

к сети через класс TWinSocketStream.

к СОМ интерфейсу через TOleStream.

к строкам, находящимся в динамической памяти TStringStream.

Класс TStream описан в модуле Classes, там же описаны многие его потомки. На рисунке 7 приведена иерархия классов потоков.

Рисунок 5 – Иерархия классов потоков

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Это не полный список классов потоков, но даже все эти класс мы рассматривать не будем. Рассмотрим только базовый класс TStream, а также пример работы с файловым потоком TFileStream.

Ниже приведены некоторые свойства и методы класса TStream.

Таблица 6 – Свойства объекта TStream

Свойства

Описание

 

 

property Position:Int64;

указывает на текущую позицию курсора в потоке. Начиная с

 

этой позиции будет происходить чтение данных.

property Size:Int64;

размер данных в потоке.

 

 

Таблица 7 – Методы класса TStream

 

 

Методы

Описание

function CopyFrom(Source: TStream; Метод копирует данные из другого потока. Source Count: Int64): Int64; – источник данных. Count – размер копируемых

данных в байтах.

function Read(var Buffer; Count: Считывание данных из потока, начиная с текущей

Longint): Longint; позиции курсора. Buffer – буфер для данных. Count

– размер считываемых данных.

function Write(const Buffer; Count: Записывает данные в поток, начиная с текущей Longint): Longint; позиции. Buffer – буфер содержащий данные для

записи. Count – размер записываемых данных.

function Seek(const Offset: Int64; Перемещение в новую позицию в потоке. Offset – Origin: TSeekOrigin): Int64; число байт на которое нужно изменить позицию.

При этом отрицательное смещение означает смещение в обратном направлении.

Origin – откуда надо двигаться, возможны три варианта:

-soFromBeginning – двигаться на указанные количество байт от начала файла.

-soFromCurrent - двигаться на указанные количество байт от текущей позиции в файле к концу файла.

-soFromEnd – двигаться от конца файла к началу на указанное количество байт.

procedure SetSize(const NewSize: Устанавливает размер потока. NewSize – число, Int64); новый размер потока. Например при использовании потока TFileStream можно

уменьшить или увеличить размер файла.

TFileStream

Класс TFileStream предназначен для работы с файлами. По сути этот класс по своим функциям аналогичен нетипизированным файлам Object Pascal. Являясь наследником TStream он наследует все его свойства и методы, а также переопределяет некоторые из них. Для создания экземпляра класса TFileStream удобно использовать следующую форму конструктора.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

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

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

Таблица 8 – Режимы работы потока

Режим

fmCreate

fmOpenRead

fmOpenWrite

fmOpenReadWrite

Ниже приведен пример программы для копирования файла из лабораторной работы № 6, но с использованием потоков.

Листинг 11 – Копирование файлов

program CopyFile;

{$APPTYPE CONSOLE}

 

uses SysUtils, Classes;

 

var Srm1,

//входной поток

Srm2:TFileStream;

//выходной поток

SourceFileName,

//имя входного файла

DestFileName:string; //имя файла копии begin

//открываем файл источник данных write('Source file >> '); readln(SourceFileName);

//создаем поток в режиме только для чтения

Srm1:=TFileStream.Create(SourceFileName, fmOpenRead);

//создаем файл приемник write('Destination file >> '); readln(DestFileName);

//создаем поток в режиме создания нового потока

Srm2:=TFileStream.Create(DestFileName, fmCreate);

//копирование содержимого потока Srm1 в Srm2 Srm2.CopyFrom(Srm1, Srm1.Size);

//уничтожение объектов

Srm1.Free;

Srm2.Free;

writeln('File success copy'); writeln('Press Enter to exit'); readln;

end.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Ниже приведена программа для чтения информации из mp3 файла. Эти файлы часто содержат информацию о звуковых данных хранящихся в файле. Эти данные хранятся в специальном блоке данных размеров в 128 байт, который имеет название ID3 tag. Если этот блок присутствует в файле, то он располагается в конце файла. Начинается этот блок со специальной комбинации символов, а именно «TAG». Таким образом, можно определить имеется ли в файле этот специальный информационный блок данных. Общая структура этого блока приведена на рисунке

а)

б)

Рисунок 6 – Общая структура ID3 tag. а) Версия 1.0. б) Версия 1.1

Программа реализующая чтение информации из mp3-файла приведена ниже.

Листинг 12 – Чтение ID3 tag из mp3 файла

program mp3Tag;

{$APPTYPE CONSOLE}

uses SysUtils, Classes,

mp3_list in 'mp3_list.pas';

var Stream:TFileStream; //файловый поток

FileName:String;

//имя

файла

buf :byte;

 

 

Tag_Type:(id3v1, id3v11);

//версия заголовка

{Считывает массив символов из потока и преобразует его в строку Size - число символов в строке}

function GetString(Size:Integer):string; var Buf:PChar;

begin

GetMem(Buf, Size);//память под временный буфер

Stream.Read(Buf^, Size);//считываем данные в буфер SetString(Result, Buf, Size);//копируем данные в строку

FreeMem(Buf);//освобождаем буфер

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

end;

begin

//ввод имени файла write('filename > '); readln(FileName);

//создаем поток

Stream:=TFileStream.Create(FileName, fmOpenRead);

//позиционируем указатель потока на 128 байт от конца файла

Stream.Seek(-128, soFromEnd);

//считываем идентификатор ID3 tag

if GetString(3)='TAG' then//если файл содержит ID3 tag begin

//определяем версию ID3 tag

//считываем значение 3-го байта от конца файла

Stream.Seek(-3, soFromEnd); Stream.Read(buf, 1);

if buf=0 then begin

Stream.Read(buf, 1);

if buf<>0 then //ID3V1.1 Tag_Type:=id3v11

else Tag_Type:=id3v1; end

else Tag_Type:=id3v1;

if Tag_Type=id3v1 then writeln('Version ID3 V1')

else

writeln('Version ID3 V1.1');

//устанавливаем указатель потока на первое поле заголовка

Stream.Seek(-125, soFromEnd);

//считываем остальные поля

writeln('Song title

- ', GetString(30));

writeln('Artist

- ', GetString(30));

writeln('Album

- ', GetString(30));

writeln('Year

- ', GetString(4));

if Tag_Type=id3v1 then

writeln('Comment

- ', GetString(30))

else

 

begin

 

writeln('Comment

- ', GetString(28));

Stream.Read(buf, 1); //пропускаем 1 байт Stream.Read(buf, 1);

writeln('Track - ', buf); end;

Stream.Read(buf, 1);

if buf<=High(mp3_genre) then writeln('Genre - ', mp3_genre[buf])

else writeln('Genre - Unknown') end