文章目录
第二十五章 Caché 变量大全 $ZB 变量 - 大纲
- 描述
-
- 文件结束行为
- 从终端或文件读取
- 命令行上的$ZB
- `$ZB`,带磁带I/O
包含当前I / O设备的状态信息。
大纲$ZB描述
$ZB包含读取操作后特定于当前I / O设备的状态信息
- 从终端,顺序文件或其他基于字符的I / O设备读取时,$ZB包含读取操作的终止字符。它可以是终止符(例如),如果读取操作不需要终止符,则可以是输入数据的最后一个字符;如果需要终止符但未收到终止符,则可以是空字符串(例如,如果读取操作超时)。
- 从磁带等基于块的I / O设备读取数据时, Z B 包 含 I / O 缓 冲 区 中 剩 余 的 字 节 数 。 写 入 磁 带 时 , ‘ ZB包含I / O缓冲区中剩余的字节数。写入磁带时,` ZB包含I/O缓冲区中剩余的字节数。写入磁带时,‘ZB`还包含I / O缓冲区中的字节数。
不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。
从基于字符的设备或文件中读取时,$ZB和$KEY都可以用于返回READ终止字符。对于基于字符的读取,这两个特殊变量非常相似,但不完全相同。对于基于块的读写(例如磁带),请使用$ZB; $KEY不支持基于块的读取和写入操作。
文件结束行为
默认情况下,Caché通过发出<ENDOFFILE>错误来处理顺序文件的文件结尾;它不会设置$ZB。可以以与MSM兼容的方式配置文件结束行为。在这种情况下,遇到文件结尾时,Caché不会发出错误,而是将$ZB设置为“”(空字符串),并将$ZEOF设置为-1。
要配置文件结束处理,请转到管理门户,依次选择“系统”,“配置”,“兼容性设置”。查看和编辑SetZEOF的当前设置。设置为“true”时,Caché将$ZB设置为“”(空字符串),并将$ZEOF设置为-1。默认值为“false”。
可以使用%SYSTEM.Process类的SetZEOF()方法控制当前进程的文件结束处理。可以通过设置Config.Miscellaneous类的SetZEOF属性来建立系统范围的默认行为。
从终端或文件读取
$ZB包含涉及终端,顺序文件或其他基于字符的I / O设备的读取操作中的终止字符(或字符序列)。 $ZB可以包含以下任意一项:
- 终止符,例如回车符。
- 转义序列(最多16个字符)。
- 固定长度READ x#n中的第n个字符。 (在这种情况下,$KEY特殊变量返回空字符串。)
- READ * x的单个字符。
- 定时读取到期后为空字符串(“”)。
例如,考虑以下具有5秒超时的可变长度读取:
/// d ##class(PHA.TEST.SpecialVariables).ZB() ClassMethod ZB() { Zbread READ !,"Enter number:",num:5 WRITE !, num WRITE !, $ASCII($ZB) QUIT }
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZB() Enter number: 13 DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZB() Enter number:2 2 13
如果用户在读取提示符下键入123并按<Return>,则Caché将123存储在num变量中,并将<Return>(ASCII十进制代码13,十六进制0D)存储在 Z B 中 。 如 果 读 取 超 时 , ‘ ZB中。如果读取超时,` ZB中。如果读取超时,‘ZB包含空字符串;$ASCII(“”)`返回值-1。
命令行上的$ZB
从终端命令行交互发出命令时,按<Return>可发出每个命令行。$ZB和$KEY特殊变量记录此命令行终止符。因此,当使用$ZB或$KEY返回读取操作的终止状态时,必须将变量设置为同一命令行的一部分。
例如,如果发出以下命令:
DHC-APP>READ x:10
从命令行检查$ZB,它将不包含读取操作的结果;它将包含执行命令行的<return>字符。要返回读取操作的结果,请在同一命令行中使用$ZB设置一个局部变量,如下所示:
DHC-APP>READ x:10 SET rzb=$ZB
这将保留由读取操作设置的$ZB的值。要显示此读取操作值,请发出以下命令行语句之一:
WRITE $ASCII(rzb) ; 空字符串(超时)返回-1, ; 返回终止符字符的ASCII十进制值 ZZDUMP rkey ; 为空字符串返回空行(超时) ; 返回终止符的十六进制值
$ZB,带磁带I/O
$ZB包含有关驱动程序缓冲区的状态信息。具体地说,它包含磁带驱动器内部缓冲区中剩余的字节数。
读完一个区块后,Caché会立即将$ZB设置为该区块的大小。当将逻辑记录从缓冲区转移到变量(使用READ命令)时,Caché将$ZB值递减,直到其达到0,然后发生下一个块读取。
写入磁带时,$ZB显示驱动程序内部缓冲区中剩余的可用空间(以字节为单位)。写入块后,Caché立即将$ZB设置为OPEN命令指定的缓冲区大小。当将逻辑记录从Caché变量传输到缓冲区(使用WRITE命令)时,Caché递减$ZB号,直到其达到0并发生块写入。
大多数磁带程序不必关心$ZB,除非它们必须处理异常的格式和可变长度的块。
为了监视磁带操作,程序可以在每次读写后测试$ZA的相应位。
以下代码在每次读取磁带后都检查$ZA和$ZB,并在这些变量中的任何一个指示错误时设置MTERR。发生磁带错误时,它还会设置$ZTRAP。
; $$MTIN(mtdev)=磁带设备mtdev的下一个逻辑记录。还返回za = $ZA和zb = $ZB在出现磁带错误时,mterr = 1和$$MTIN(mtdev)=“”期望调用者设置$ZT来捕获其他错误。 MTIN(io) NEW rec,curdev SET mterr=0,curdev=$IO,$ZT="MTIERR" USE io READ rec MTIEXIT SET za=$ZA,zb=$ZB USE curdev QUIT rec MTIERR IF $ZERROR["MAGTAPE" { USE curdev ZQUIT 1 GOTO @$ZTRAP } ; Use caller's error trap. ELSE { SET $ZTRAP="",mterr=1,rec="" GOTO MTIEXIT }
如果终止符完成READ,则Caché 模式将终止符作为$ZB中的字符串返回。
如果转义序列终止读取,则Caché模式将ASCII转义序列作为$ZB中的字符串返回。