9 января,
2001
Владимир Трухин
ведущий инженер-программист
ОАО "Воткинская ГЭС"
Fax: +7 (34241) 63297
E-mail: vlt@gesvt.permenergo.ru
vlt@votges.ru
Многоканальный
вывод в текстовый файл.
Проблема
Бывают
такие задачи, в которых программа
время от времени производит
запись данных в текстовый файл.
Можно найти множество примеров
для этого случая.
Как
правило, для такого вывода данных
используется команда ‘?’.
Конечно, если выводится строка за
строкой, то применение команды не
связано с неудобствами. Другое
дело, когда нужно сделать вывод
одной строки, закрыть файл, а
через некоторое время вывести
другую строку и т.д. Ещё хуже, если
необходимо выводить строки
попеременно в разные файлы. От
изобилия команды ‘SET’ просто
начинает рябить в глазах.
Решение.
Всё
намного упрощается, если создать
некоторый класс, контролирующий
поток данных к конкретному файлу
и самостоятельно использующий
команды ‘SET’ применительно к
ситуации.
Имея
такой класс, можно создать
несколько объектов, каждый из
которых управляет выводом в свой
файл, и легко выводить данные,
забыв о командах ‘SET’.
Примерный
состав свойств и методов класса
Свойства:
-
Имя
файла для канала вывода
-
Режим
вывода в файл: .T. - с
добавлением записей, .F. -
создание нового файла
-
Состояние
канала: .T.-открыт, .F.-закрыт
Методы:
-
Открытие
канала для вывода в файл
-
Вывод
строк, открывая и закрывая
канал
-
Вывод
строки, сохраняя состояние
канала
-
Закрытие
канал вывода
Примерное
определение класса
DEFINE
CLASS textfile AS custom
*--
Имя файла для канала вывода
filename = "output.txt"
*--
Путь
path = ""
*
Имя класса
Name = "textfile"
*--
Режим вывода: .T. - с добавлением
записей к файлу, .F. - создание
нового файла
additive = .F.
*--
Состояние канала: .T. - открыт, .F. -
закрыт
status = .F.
*--
Внутреннее состояние
HIDDEN intstatus
*--
Состояние консоли перед
открытием канала
HIDDEN consol
*--
Вывод строки с открытием и
закрытием канала
PROCEDURE output
lparameters lcString, llMode
local lnParam
lnParam=parameter()
if lnParam < 2
llMode=.T.
endif
this.OpenOutput()
if llMode
? lcString
else
?? lcString
endif
this.CloseOutput()
ENDPROC
*--
Открытие канала вывода
PROCEDURE openoutput
if this.Additive
set alternate to (allt(this.Path)+'\'+allt(this.FileName))
ADDITIVE
else
set alternate to (allt(this.Path)+'\'+allt(this.FileName))
endif
set alternate on
set console off
this.IntStatus=.T.
ENDPROC
*--
Закрытие канала вывода
PROCEDURE closeoutput
set alternate off
set alternate to
set console on
this.IntStatus=.F.
ENDPROC
PROCEDURE
additive_assign
LPARAMETERS vNewVal
if this.Status
this.CloseOutput()
endif
THIS.additive = m.vNewVal
ENDPROC
PROCEDURE
filename_assign
LPARAMETERS vNewVal
if this.Status
this.CloseOutput()
endif
THIS.filename = m.vNewVal
ENDPROC
PROCEDURE
path_assign
LPARAMETERS vNewVal
if this.Status
this.CloseOutput()
endif
THIS.path = m.vNewVal
ENDPROC
PROCEDURE
status_assign
LPARAMETERS vNewVal
THIS.status = this.IntStatus
ENDPROC
*--
Вывод строки без изменения
состояния канала
PROCEDURE listoutput
lparameters lcString, llMode
local lnParam
lnParam=parameter()
if lnParam < 2
llMode=.T.
endif
if llMode
? lcString
else
?? lcString
endif
ENDPROC
PROCEDURE
status_access
RETURN this.IntStatus
ENDPROC
PROCEDURE
release
release this
ENDPROC
PROCEDURE
Init
lparameters lcPath,lcFile,llAdd
if type('lcPath')='C'
this.Path=lcPath
endif
if type('lcFile')='C'
this.FileName=lcFile
endif
if type('llAdd')='L'
this.Additive=llAdd
endif
ENDPROC
ENDDEFINE
Пример
использования класса.
Рассмотрим
пример, в котором организуются
два канала вывода в разные
текстовые файлы.
Программный
код примера:
#define
CR .T.
#define NOCR .F.
local
loChannelOne, loChannelTwo
* создать каналы вывода
loChannelOne=CREATEOBJECT('TextFile',CURDIR(),'First.txt',.T.)
loChannelTwo=CREATEOBJECT('TextFile',CURDIR(),'Second.txt',.T.)
loChannelOne.Additive=.F.
loChannelOne.Output('The Memoirs of Sherlock Holmes. Silver
Blaze.',NOCR)
loChannelOne.Additive=.T.
loChannelOne.Output('',CR)
loChannelTwo.Additive=.F.
loChannelTwo.Output('The Return of Sherlock Holmes.',NOCR)
loChannelTwo.Additive=.T.
loChannelTwo.Output('The Adventury of the Empty House',CR)
loChannelTwo.Output('',CR)
*
... какой-либо код
loChannelOne.OpenOutput()
loChannelOne.ListOutput('...And so it happened that an hour
'+;
'or so later I found myself in the',CR)
loChannelOne.ListOutput('corner of a first-class carriage
flying '+;
'along
en route for Exeter, while',CR)
loChannelOne.ListOutput('Sherlock Holmes, with his sharp,
eager '+;
'face framed in his ear-flapped...',CR)
loChannelOne.CloseOutput()
*
... какой-либо код
loChannelTwo.Output('
'+;
'... Even now, after this long interval, I',CR)
loChannelTwo.Output('find myself thrilling as I think of it,
'+;
'and feeling once more that sudden',CR)
*
... какой-либо код
loChannelTwo.Output('flood
of joy, amazement, and incredulity which '+;
'utterly submerged my',CR)
loChannelTwo.Output('mind...',CR)
return
Результат
работы программы:
Файл
FIRST.TXT
The Memoirs of
Sherlock Holmes. Silver Blaze.
...And so it happened that an hour or so
later I found myself in the
corner of a first-class carriage flying
along en route for Exeter, while
Sherlock Holmes, with his sharp, eager
face framed in his ear-flapped... |
Файл
SECOND.TXT
The
Return of Sherlock Holmes.
The Adventury of the Empty House
... Even now, after this long interval, I
find myself thrilling as I think of it,
and feeling once more that sudden
flood of joy, amazement, and incredulity
which utterly submerged my
|
Демонстрационный
пример и текст статьи в формате MS
Word (zip-файл,19KB)
Главная
страница | Технологии | Продукция | Материалы | Специалисты | Партнёры
Запись
в Гостевую Книгу |
Просмотр Гостевой Книги
|