English Version - www.geocities.com/vhpcg
VHP Computing Group
ТехнологииПродукцияМатериалыСпециалистыПартнёрыЗапись в Гостевую КнигуПросмотр Гостевой Книги

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)


Главная страница | Технологии | Продукция | Материалы | Специалисты | Партнёры
Запись в Гостевую Книгу | Просмотр Гостевой Книги

 
1