ЗАДАНИЕ XVIII

Тема: Работа с потоками ( файлами ).
Цель: Краткое знакомство с файлами в среде Stratum.

Перед началом работы необходимо:

владение основными приемами работы в MS Windows
владение основными приемами работы в Stratum 2000

Основные сведения о потоках

Механизм потоков
    Потоком называется обобщенный объект для реализации ввода-вывода данных. На фундаментальном уровне можно рассматривать потоки как абстрактные файлы. В своей основе файл представляет собой последовательное устройство ввода-вывода: его можно записывать и считывать из него. Кроме этого, поток - это полиморфическое устройство последовательного ввода-вывода, то есть оно ведет себя как последовательный файл, но вы можете считывать и записывать в него различные типы данных в каждый момент времени.
    Потоки (как и файлы ) можно просматривать также, как устройства ввода-вывода произвольного доступа, искать определенное место в файле, считывать данные в этой точке или записывать данные в эту точку, возвращать позицию указателя файла и так далее.
    Механизм потоков поддерживается набором специальных функций. Функции обеспечивают гибкие и эффективные методы для обработки данных различных форматов и реализуют возможность расширения для обработки типов, определенных пользователем.
Файловые потоки
    Основное назначение потоков - чтение и запись данных из файлов. При открытии потока указывается тип потока FILE и имя файла. Размер потока равен размеру файла. Если идет запись в файл, то все записанные данные становятся действительными только после закрытия потока.
Открытие потока
    Для создания потока используется функция CreateStream(). Функция возвращает дескриптор потока, с помощью которого к нему осуществляется в дальнейшем доступ. Текущая позиция потока устанавливается на начало. Перечень открытых потоков можно просмотреть в диалоговом окне Информация (системное меню - Вид - Информация).
Чтение данных из потока
    Чтение возможно из потока, открытого на чтение, и осуществляется с помощью функций Read() - для чисел, ReadLn() и GetLine() - для строк. В зависимости от размера данных текущая позиция в потоке после каждого считывания увеличивается. При попытке считывания из потока после выхода позиции на конец потока устанавливается специальный флаг (можно проверить функцией Eof()).
Запись данных в поток
    Запись данных возможна для потока, открытого на запись, и осуществляется с помощью функций Write() - для чисел, WriteLn() - для строк. В зависимости от размера данных текущая позиция в потоке после каждой записи увеличивается. При попытке записи в потока после окончания свободного пространства на диске устанавливается специальный флаг (можно проверить функцией StreamStatus()).

Задание 1.

Запись в файл
    Создадим новый проект. В проекте создадим окно и в окне прямоугольник (с помощью системных имиджей). Добавим имидж DragObjects. Проверим, что окно открывается, в нем появляется прямоугольник и его положение можно менять c помощью мышки.
lab018.gif (6768 bytes)

    Создадим новый имидж, который будет записывать в файл координаты прямоугольника при нажатии на заданную клавишу.

Текст имиджа будет иметь текст :

HANDLE Hstream      // Дескриптор потока

if(code==83)        // Нажата клавиша "S"
if(not(HStream))    // Если файл не открыт то создаем его
HStream:=CreateStream("FILE","data.txt","CREATE")
endif
// Записываем координаты в строковом виде
rez:=WriteLn(~HStream,string(~x)+","+string(~y))
code:=0             // Обнуляем код клавиши
endif

    Запустите проект, перемещайте прямоугольник. Для записи положение прямоугольника нажмите клавишу "S". Остановите проект и проверьте, что файл создался и содержит координаты графического объекта.

Задание 2.

Чтение из файла.
Изменим имидж, чтобы при нажатии на другую клавишу, происходило считывание из файла. Для этого добавим следующий текст.

if(code==65)             // Нажата клавиша "A"
if(not(HStream))        // Если файл не открыт то открываем его
HStream:=CreateStream("FILE","data.txt","READWRITE")
endif
str:=ReadLn(~HStream)   // Чтение строки
if(Eof(~HStream))       // Если достигли конца файла то переходи на начало
rez:=Seek(~HStream,0)
str:=ReadLn(~HStream)
endif
str := Change(~str,Chr(10),"")
str := Change(~str,Chr(13),"")

i:=pos(~str,',',1)      // Определяем позицию запятой
if(~i>0)
x:=float(substr(~str,0,~i))      // извлекаем X
y:=float(substr(~str,~i+1,10))   // извлекаем Y

endif
code:=0                  // Обнуляем код клавиши
endif


Запустите проект. Теперь при каждом нажатии на клавишу "A" из файла считывается строка. Из этой строки извлекаются переменные x и y. После чего прямоугольник перемещается в нужную позицию.