вторник, 19 марта 2019 г.

MiniM. Как обрабатывать конец файла

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

При чтении данных из файла возможны 4 ситуации для принятия решения о прекращении чтения из файла:
  • программе чтения известно, сколько следует читать, например информация о длине содержится в заголовке файла
  • программе чтения известен признак окончания входных данных
  • при чтении программа ожидает ошибку <ENDOFFILE>
  • при чтении программа ожидает индикатор $zeof
Первые два случая являются тривиальными, поэтому рассмотрим два остальных.

Ожидание ошибки <ENDOFFILE>.

В этом случае программа чтения должна установить обработчик ошибки перед чтением из файла, и выполнять чтение. При обнаружении невозможности чтения процесс MiniM генерирует ошибку <ENDOFFILE> и управление передается подпрограмме обработки ошибки. В ней программа должна при необходимости закрыть файл если он более не нужен и обработать ошибку.

Текстовое значение ошибки "ENDOFFILE" не входит в стандарт, но генерация ошибки при невозможности выполнить чтение стандартом подразумевается. Текстовое значение "ENDOFFILE" используется в MiniM для совместимости с другими реализациями MUMPS для лучшей переносимости программ.

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

Пример чтения из текстового файла с ожиданием ошибки <ENDOFFILE>:
eof1  ; k  d eof1^eof w
 ; first sample is based on standard error handling
 ; read file up to <ENDOFFILE> error was reached
 ; read from this file all lines into local variable
 n dev="|FILE|c:\temp\dat.txt",lines,line,oldio=$io
 ; set error trapping handler
 n $et="g eof1end"
 ; read all lines
 o dev:("rt") u dev
 f  r line s lines($i(lines))=line
eof1end
 c dev      ; close device in any case
 ; no more error handling on end of file
 ; or continue error handling
 i $ze["<ENDOFFILE>" s $ec=""
 ; restore current device
 u oldio
 q
Ожидание индикатора $zeof

В этом случае программа чтения должна перевести процесс в режим обработки индикатора $zeof вызвав функцию $v("proc",5). И системная переменная $zeof и функция $v("proc") не входят в стандарт языка MUMPS, что следует учитывать при написании переносимых программ.

При включенном режиме обработки конца файла взведением индикатора $zeof программа должна после команды чтения проверять этот индикатор и если он взведен (равен 1) то прекратить чтение.

Пример чтения из текстового файла с проверкой индикатора $zeof:
eof2  ; k  d eof2^eof w
 ; second sample is based on using
 ; nonstandard $zeof system variable
 ; read from file up to $zeof indicator will be on
 n dev="|FILE|c:\temp\dat.txt",lines,line,oldio=$io
 ; set $zeof behavior, does not raise an error and
 ; set $zeof indicator
 n oldeof=$v("proc",5,0)
 ; read all lines
 o dev:("rt") u dev
 ; if $zeof is on, don't read more lines
 f  r line q:$zeof  s lines($i(lines))=line
 ; restore eof behavior
 i $v("proc",5,oldeof)
 ; close device
 c dev
 ; restore current device
 u oldio
 q
Индикатор $zeof в MiniM применяется к устройствам типов |FILE|, |PIPE|, |TCP|, |STORE| и к устройствам ZDEVICE (внешние устройства, описанные в dll), если они поддерживают обработку $zeof. Индикатор $zeof возвращает значение только для текущего устройства.

Индикатор конца файла взводится если команда чтения строки или одного символа не смогла прочитать ни одного байта по причине того что входная последовательность закончилась. Если чтение нескольких байт возможно, что команда чтения строки возвращает эту строку. Если чтение невозможно по другим причинам, то процесс MiniM генерирует ошибку <READ>.

Комментариев нет:

Отправить комментарий