ЗАДАНИЕ XVIII
Тема: Работа с потоками (
файлами ). Цель: Краткое знакомство с файлами в среде Stratum. |
Перед началом работы необходимо:
владение основными приемами работы в MS Windows |
владение основными приемами работы в Stratum 2000 |
Основные сведения о потоках
Механизм потоков
Потоком называется обобщенный
объект для реализации ввода-вывода данных. На
фундаментальном уровне можно рассматривать
потоки как абстрактные файлы. В своей основе файл
представляет собой последовательное устройство
ввода-вывода: его можно записывать и считывать из
него. Кроме этого, поток - это полиморфическое
устройство последовательного ввода-вывода, то
есть оно ведет себя как последовательный файл, но
вы можете считывать и записывать в него
различные типы данных в каждый момент времени.
Потоки (как и файлы ) можно
просматривать также, как устройства ввода-вывода
произвольного доступа, искать определенное
место в файле, считывать данные в этой точке или
записывать данные в эту точку, возвращать
позицию указателя файла и так далее.
Механизм потоков поддерживается
набором специальных функций. Функции
обеспечивают гибкие и эффективные методы для
обработки данных различных форматов и реализуют
возможность расширения для обработки типов,
определенных пользователем.
Файловые потоки
Основное назначение потоков - чтение и
запись данных из файлов. При открытии потока
указывается тип потока FILE и имя файла. Размер
потока равен размеру файла. Если идет запись в
файл, то все записанные данные становятся
действительными только после закрытия потока.
Открытие потока
Для создания потока используется
функция CreateStream(). Функция возвращает
дескриптор потока, с помощью которого к нему
осуществляется в дальнейшем доступ. Текущая
позиция потока устанавливается на начало.
Перечень открытых потоков можно просмотреть в
диалоговом окне Информация (системное меню - Вид -
Информация).
Чтение данных из потока
Чтение возможно из потока, открытого
на чтение, и осуществляется с помощью функций Read()
- для чисел, ReadLn() и GetLine() - для
строк. В зависимости от размера данных текущая
позиция в потоке после каждого считывания
увеличивается. При попытке считывания из потока
после выхода позиции на конец потока
устанавливается специальный флаг (можно
проверить функцией Eof()).
Запись данных в поток
Запись данных возможна для потока,
открытого на запись, и осуществляется с помощью
функций Write() - для чисел, WriteLn() -
для строк. В зависимости от размера данных
текущая позиция в потоке после каждой записи
увеличивается. При попытке записи в потока после
окончания свободного пространства на диске
устанавливается специальный флаг (можно
проверить функцией StreamStatus()).
Задание 1.
Запись в файл
Создадим новый проект. В проекте
создадим окно и в окне прямоугольник (с помощью
системных имиджей). Добавим имидж DragObjects.
Проверим, что окно открывается, в нем появляется
прямоугольник и его положение можно менять c
помощью мышки.
Создадим новый имидж, который будет записывать в файл координаты прямоугольника при нажатии на заданную клавишу.
Текст имиджа будет иметь текст :
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. После чего прямоугольник перемещается в нужную
позицию.