Sun Studio 12:Fortran 库参考

1.4.44 set_io_err_handlerget_io_err_handler:设置和获取 I/O 错误处理程序

set_io_err_handler() 声明每当在指定的输入逻辑单元中检测到错误时要调用的用户自定义例程。

get_io_err_handler() 返回当前声明的错误处理例程的地址。

这些例程为模块子例程,只有当调用例程中有 USE SUN_IO_HANDLERS 时,才能访问这些例程。

USE SUN_IO_HANDLERS

call set_io_err_handler(iu, subr_name, istat)

iu

INTEGER*8

输入 

逻辑单元编号 

subr_name

EXTERNAL

输入 

用户提供的错误处理程序子例程的名称。 

istat

INTEGER*4

输出 

返回状态。 

USE SUN_IO_HANDLERS

call get_io_err_handler(iu, subr_pointer, istat)

iu

INTEGER*8

输入 

逻辑单元编号 

subr_pointer

POINTER

输出 

当前声明的处理程序例程的地址。 

istat

INTEGER*4

输出 

返回状态。 

SET_IO_ERR_HANDLER 设置用户提供的子例程 subr_name,它在出现输入错误时用作逻辑单元 iu 的 I/O 错误处理程序。对于格式化的文件,iu 必须是连接的 Fortran 逻辑单元。如果有错误,istat 将设置为非零值,否则设置为零。

例如,如果在打开逻辑单元 iu 之前调用 SET_IO_ERR_HANDLERistat 将设置为 1001(“非法单元”)。如果 subr_name 为 NULL,用户错误处理将关闭,且程序恢复到缺省的 Fortran 错误处理。

可使用 GET_IO_ERR_HANDLER 获取当前用作相应逻辑单元的错误处理程序的函数的地址。例如,先调用 GET_IO_ERR_HANDLER 保存当前 I/O,然后再切换到另一个处理程序例程。以后可以通过保存的值恢复错误处理程序。

subr_name 是用户提供的例程的名称,用于处理逻辑单元 iu 上的 I/O 错误。运行时 I/O 库将所有相关信息传递给 subr_name,以使该例程可以诊断问题并在可能的情况下修复错误,然后继续运行。

用户提供的错误处理程序例程的接口如下所示:

SUBROUTINE SUB_NAME(UNIT, SRC_FILE, SRC_LINE, DATA_FILE, FILE_POS,

CURR_BUFF, CURR_ITEM, CORR_CHAR, CORR_ACTION )

INTENT (IN) UNIT, SRC_FILE, SRC_LINE, DATA_FILE

INTENT (IN) FILE_POS, CURR_BUFF, CURR_ITEM

INTENT (OUT) CORR_CHAR, CORR_ACTION

UNIT

INTEGER*8

输入 

报告错误的输入文件的逻辑单元编号 

SRC_FILE

CHARACTER*(*)

输入 

引起输入操作的 Fortran 源文件名称。 

SRC_LINE

INTEGER*8

输入 

输入操作的 SRC_FILE 中有错误的行号。

DATA_FILE

CHARACTER*(*)

输入 

正在读取的数据文件名称。仅适用于已打开的外部文件。如果名称不可用(例如,逻辑单元 5),DATA_FILE 将设置为长度为零的字符数据项。

FILE_POS

INTEGER*8

输入 

在输入文件中的当前位置(以字节数表示)。只有当 DATA_FILE 的名称已知时,才能定义该项。

CURR_BUFF

CHARACTER*(*)

输入 

包含输入记录中剩余数据的字符串。错误的输入字符是字符串中的第一个字符。 

CURR_ITEM

INTEGER*8

输入 

检测到错误时,记录中已读取的输入项数(包括当前输入项)。例如:READ(12,10)L,(ARR(I),I=1,L)

在此示例中,如果 CURR_ITEM 的值为 15,表示在读取 ARR 的第 14 个元素时出现错误,L 是第一项,ARR(1) 是第二项,依此类推。

CORR_CHAR

CHARACTER

输出 

由处理程序返回的用户所提供的更正字符。只有当 CORR_ACTION 不为零时,才使用该值。如果 CORR_CHAR 是无效字符,将会再次调用处理程序,直到返回有效字符。这可能会导致出现无限循环,用户要防止出现这种情形。

CORR_ACTION

INTEGER

输出 

指定 I/O 库要采取的更正措施。如果值为零,则不采取特殊措施,库将恢复到其缺省的错误处理。如果值为 1CORR_CHAR 将返回到 I/O 错误处理例程。

1.4.44.1 局限性

I/O 处理程序只能用另一个字符替换一次。它不能用多个字符替换一个字符。

错误恢复算法只能修复当前读取的错误字符,而不能修复在其他上下文环境中已经解释为有效字符的错误字符。例如,在进行列表控制的读取时,如果输入是 "1.234509.8765",而正确的输入应该是 "1.2345 9.8765",I/O 库将在第二个阶段遇到错误,因为它不是有效的数字。但此时不能回去将 '0' 更改为空白。

当前,这种错误处理功能不适用于名称列表控制的输入。在进行名称列表控制的输入时,如果出现错误,不会调用指定的 I/O 错误处理程序。

只能为外部文件而不能为内部文件设置 I/O 错误处理程序,这是因为没有与内部文件关联的逻辑单元。

只能针对语法错误而不能针对系统错误或语义错误(例如溢出的输入值)调用 I/O 错误处理程序。

如果用户提供的 I/O 错误处理程序不断向 I/O 库提供错误的字符,从而导致反复调用用户提供的 I/O 错误处理程序,则可能出现无限循环。如果在同一个文件位置反复出现错误,错误处理程序应该自行终止运行。一种解决方法就是通过将 CORR_ACTION 设置为 0 来采用缺省的错误路径。这样,I/O 库将继续运行并进行正常的错误处理。