提供此手册页仅出于历史的原因。Fortran 95 (f95) 中未实现此功能。
可以使用这些函数从 FORTRAN 操作磁带。
在任何一个单元上,都不要将这些函数与标准 FORTRAN I/O 混合。
必须先使用 topen() 打开指定设备的磁带逻辑单元 tlu。然后,对指定的 tlu 执行其他所有操作。tlu 与任何正常的 FORTRAN 逻辑单元没有任何关系。
在使用这些函数中的某个函数之前,INTEGER 语句中必须有其名称。
topen-将设备名称与磁带逻辑单元关联,即,不移动磁带。
语法:n = topen( tlu, devnam, islabeled )
tlu 是磁带逻辑单元。这是一个整数输入参数,必须在 0 到 7 范围内。islabeled 指示磁带是否有标签。这是一个逻辑输入参数。
如果知道磁带包含磁带标签,则将 islabeled 设置为 true。标签是磁带上的第一个文件。
n 是返回值:n=0 表示正常。n<0 表示有错误。有关详细信息,请参见 perror(3F)。
示例:打开一个 1/4" 磁带文件:
CHARACTER devnam*9 / '/dev/rst0' / INTEGER n / 0 /, tlu / 1 /, topen LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) IF ( n .LT. 0 ) STOP "topen: cannot open" WRITE(*,'("topen ok:", 2I3, 1X, A10)') n, tlu, devnam END
输出为:
topen ok: 0 1 /dev/rst0
tclose-写入 EOF 并关闭磁带设备通道,取消其与 tlu 的关联。
语法:n = tclose ( tlu )
tlu 是磁带逻辑单元。这是一个在 0 到 7 范围内的整数输入参数。n 是整数返回值。n=0 表示正常。n<0 表示有错误。tclose() 将 EOF 标记放在紧接单元指针当前位置的后面,然后关闭单元。因此,如果在对某个单元使用 tclose() 之前对其使用 trewin(),则将丢弃其内容。
示例:关闭一个打开的 1/4" 磁带文件:
CHARACTER devnam*9 / '/dev/rst0' / INTEGER n / 0 /, tlu / 1 /, tclose, topen LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) n = tclose ( tlu ) IF ( n .LT. 0 ) STOP "tclose: cannot close" WRITE(*, '("tclose ok:", 2I3, 1X, A10)') n, tlu, devnam END
输出为:
tclose ok: 0 1 /dev/rst0
twrite-将下一个物理记录从缓冲区写入磁带。
语法:n = twrite ( tlu, buffer )
tlu 是磁带逻辑单元。这是一个整数输入参数,必须在 0 到 7 范围内。buffer 必须是字符类型,并且其大小必须是 512 的倍数。n 是返回值。n >0 表示正常,并且写入了 n = 字节数。n =0 表示磁带末尾,n <0 表示错误。物理记录长度等于 buffer 的大小。
示例:写入一个包含两个记录的文件:
CHARACTER devnam*9 / '/dev/rst0' /, rec1*512 / "abcd" / CHARACTER rec2*512 / "wxyz" / INTEGER n / 0 /, tlu / 1 /, tclose, topen, twrite LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) IF ( n .LT. 0 ) STOP "topen: cannot open" n = twrite ( tlu, rec1 ) IF ( n .LT. 0 ) STOP "twrite: cannot write 1" n = twrite ( tlu, rec2 ) IF ( n .LT. 0 ) STOP "twrite: cannot write 2" WRITE(*, '("twrite ok:", 2I4, 1X, A10)') n, tlu, devnam END
输出为:
twrite ok: 512 1 /dev/rst0
tread-将下一个物理记录从磁带读入缓冲区。如果位于 EOF 或 EOT,则返回,不读取磁带。
语法:n = tread ( tlu, buffer )
tlu 是磁带逻辑单元。这是一个整数输入参数,必须在 0 到 7 范围内。buffer 必须是字符类型,并且其大小必须是 512 的倍数。
buffer 的大小应足够大,可以存放要读取的最大物理记录。
n 是返回值。n <0 表示有错误。n =0 表示文件末尾。如果 n >0,则 n 是读取的实际字节数。
示例:读取上面写入的文件的第一个记录。
CHARACTER devnam*9 / '/dev/rst0' /, onerec*512 / " " / INTEGER n / 0 /, tlu / 1 /, topen, tread LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) IF ( n .LT. 0 ) STOP "topen: cannot open" n = tread ( tlu, onerec ) IF ( n .LT. 0 ) STOP "tread: cannot read" WRITE(*,'("tread ok:", 2I4, 1X, A10)') n, tlu, devnam WRITE(*,'( A4)') onerec END
输出为:
tread ok: 512 1 /dev/rst0 abcd
trewin-将磁带反绕到第一个数据文件的开头。
语法:n = trewin ( tlu )
tlu 是磁带逻辑单元。这是一个整数输入参数,必须在 0 到 7 范围内。n 是返回值。n =0 表示正常。n <0 表示有错误。如果磁带有标签(请参见上面的 topen),则反绕后将跳过标签。
示例 1:典型片段:
CHARACTER devnam*9 / '/dev/rst0' / INTEGER n /0/, tlu /1/, tclose, topen, tread, trewin ... n = trewin ( tlu ) IF ( n .LT. 0 ) STOP "trewin: cannot rewind" WRITE(*, '("trewin ok:", 2I4, 1X, A10)') n, tlu, devnam ... END
示例 2:在一个包含两个记录的文件中,尝试读取 3 个记录,然后反绕并读取 1 个记录。
CHARACTER devnam*9 / '/dev/rst0' /, onerec*512 / " " / INTEGER n / 0 /, r, tlu / 1 /, topen, tread, trewin LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) IF ( n .LT. 0 ) STOP "topen: cannot open" DO r = 1, 3 n = tread ( tlu, onerec ) WRITE(*,'(1X, I2, 1X, A4)') r, onerec END DO n = trewin ( tlu ) IF ( n .LT. 0 ) STOP "trewin: cannot rewind" WRITE(*, '("trewin ok:" 2I4, 1X, A10)') n, tlu, devnam n = tread ( tlu, onerec ) IF ( n .LT. 0 ) STOP "tread: cannot read after rewind" WRITE(*,'(A4)') onerec END
输出为:
1 abcd 2 wxyz 3 wxyz trewin ok: 0 1 /dev/rst0 abcd
tskipf-向前跳过文件或记录,并重置 EOF 状态。不向后跳过。
语法:n = tskipf( tlu, nf, nr )
tlu 是磁带逻辑单元。这是一个整数输入参数。它必须在 0 到 7 范围内。nf 是要先跳过的文件末尾标记数(整数)。nr 是在跳过文件之后要跳过的物理记录数(整数)。n 是整数返回值。n=0 表示正常。n<0 表示有错误。首先,跳过 nf 文件末尾标记。然后,跳过 nr 个物理记录。如果当前文件处在 EOF,则将此计为一个要跳过的文件。此函数还会重置 EOF 状态。请参见下面的 tstate。
示例:典型片段 (\m 跳过四个文件,然后跳过一个记录。另请参见 tstate,第二个示例。
INTEGER nfiles / 4 /, nrecords / 1 /, tskipf, tlu / 1 / ... n = tskipf( tlu, nfiles, nrecords ) IF ( n .LT. 0 ) STOP "tskipf: cannot skip"
tstate-确定磁带 I/O 通道的逻辑状态。
语法:n = tstate ( tlu, fileno, recno, errf, eoff, eotf, tcsr )
tlu 是磁带逻辑单元。这是一个整数输入参数,必须在 0 到 7 范围内。fileno 是一个整数输出参数,指示当前文件编号。recno 是一个整数输出参数,指示当前记录编号。errf 是一个逻辑输出参数,指示发生错误。eoff 是一个逻辑输出参数,指示当前文件处于 EOF。
当 eoff 为 true 时,无法从该 tlu 中读取。可以使用 tskipf() 将此 EOF 状态标志设置为 false,以跳过一个文件和零个记录:n=tskipf( tlu, 1, 0 )。然后,可以读取随后的任何有效记录。
eotf 是一个逻辑输出参数,指示磁带已到达逻辑的磁带末尾。
EOT 由空文件指示,经常称为双 EOF 标记。不能读取过去的 EOT,但可以写入过去的 EOT。
tcsr 是一个整数输出参数,针对设备上的硬件错误。其中包含磁带机控制状态寄存器。如果错误是软件,则 tcsr 返回零。在此状态寄存器中返回的值会因磁带机的品牌和容量而有很大的差异。有关详细信息,请参见 st(4s)。
示例:写入 3 个文件,每个文件包含 2 个记录。下一个示例使用 tstate() 捕获 eof 并了解所有文件:
CHARACTER devnam*10 / '/dev/nrst0' /, & f0rec1*512 / "eins" /, f0rec2*512 / "zwei" /, & f1rec1*512 / "ichi" /, f1rec2*512 / "ni__" /, & f2rec1*512 / "un__" /, f2rec2*512 / "deux" / INTEGER n / 0 /, tlu / 1 /, tclose, topen, trewin, twrite LOGICAL islabeled / .false. / n = topen ( tlu, devnam, islabeled ) n = trewin ( tlu ) n = twrite ( tlu, f0rec1 ) n = twrite ( tlu, f0rec2 ) n = tclose ( tlu ) n = topen ( tlu, devnam, islabeled ) n = twrite ( tlu, f1rec1 ) n = twrite ( tlu, f1rec2 ) n = tclose ( tlu ) n = topen ( tlu, devnam, islabeled ) n = twrite ( tlu, f2rec1 ) n = twrite ( tlu, f2rec2 ) n = tclose ( tlu ) END
示例:循环使用 tstate() 以读取在上一个示例中写入的三个文件的所有记录:
CHARACTER devnam*10 / '/dev/nrst0' /, onerec*512 / " " / INTEGER f, n / 0 /, tlu / 1 /, tcsr, topen, tread, trewin INTEGER tskipf, tstate LOGICAL errf, eoff, eotf, islabeled / .false. / n = topen ( tlu, devnam, islabeled ) n = tstate ( tlu, fn, rn, errf, eoff, eotf, tcsr ) WRITE(*,1) 'open:', fn, rn, errf, eoff, eotf, tcsr 1 FORMAT(1X, A10, 2I2, 1X, 1L, 1X, 1L,1X, 1L, 1X, I2 ) 2 FORMAT(1X, A10, 1X, A4, 1X, 2I2, 1X, 1L, 1X, 1L,1X, 1L, 1X, I2) n = trewin ( tlu ) n = tstate ( tlu, fn, rn, errf, eoff, eotf, tcsr ) WRITE(*,1) 'rewind:', fn, rn, errf, eoff, eotf, tcsr DO f = 1, 3 eoff = .false. DO WHILE ( .NOT. eoff ) n = tread ( tlu, onerec ) n = tstate ( tlu, fn, rn, errf, eoff, eotf, tcsr ) IF (.NOT. eoff) WRITE(*,2) 'read:', onerec, fn, rn, errf, 1 eoff, eotf, tcsr END DO n = tskipf ( tlu, 1, 0 ) n = tstate ( tlu, fn, rn, errf, eoff, eotf, tcsr ) WRITE(*,1) 'tskip: ', fn, rn, errf, eoff, eotf, tcsr END DO END
输出为:
open: 0 0 F F F 0 rewind: 0 0 F F F 0 read: eins 0 1 F F F 0 read: zwei 0 2 F F F 0 tskip: 1 0 F F F 0 read: ichi 1 1 F F F 0 read: ni__ 1 2 F F F 0 tskip: 2 0 F F F 0 read: un__ 2 1 F F F 0 read: deux 2 2 F F F 0 tskip: 3 0 F F F 0
EOF 和 EOT 摘要:
如果处于 EOF 或 EOT,则:
任何 tread() 都直接返回,不读取磁带。
tskipf( tlu, 1, 0 ) 将 EOF 状态重置为 false 并返回,不推进磁带指针。
成功的 twrite() 将 EOF 和 EOT 状态标志重置为 false。
成功的 tclose() 将所有这些标志重置为 false。
tclose() 截断。tclose() 将 EOF 标记直接放在单元指针的当前位置之后,然后关闭单元。因此,如果使用 trewin() 反绕某个单元后再使用 tclose() 将其关闭,则将丢弃其内容。tclose() 的此行为继承自 Berkeley 代码。
提供此手册页仅出于历史的原因。Fortran 95 (f95) 中未实现此功能。