TOPEN(3F)

名前
topen, tclose, tread, twrite, trewin, tskipf, tstate - FORTRAN テープ入出力 (OBSOLETE)

注意事項 : 廃止事項
このマニュアルページは、履歴情報としてのみ提供されます。 この機能は、Fortran 95 (f95) には実装されません。

概要
これらの関数を用いて、 FORTRAN から磁気テープを操作できます。
標準の FORTRAN 入出力に対して、これらの関数を使用しないでください。
まず topen() で、該当するデバイスのテープ論理ユニット tlu を呼び出す必要があります。 その後の操作は、 tlu 上で行なってください。 tlu は、通常の FORTRAN 論理ユニットとは関係ありません。
これらの関数を使用する場合、その前の INTEGER 文の中に該当する関数名がなければなりません。

機能説明

topen — デバイス名をテープ論理ユニットに対応付けます。つまり、テープは動きません。

構文 : n = topen( tlu, devnam, islabeled )
tlu はテープ論理ユニットです。 これは、整数入力引数で、0 から 7 までの範囲でなければなりません。
islabeled は、テープがラベル付けされているかどうかを示します。 これは、論理入力引数です。
テープにテープラベルが含まれていることが分かっている場合は、 islabeled を「真」に設定してください。 ラベルとは、テープ上の先頭のファイルです。
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 のサイズに一致します。

使用例 : 2 つのレコードで構成されるファイルを書き込みます。

        CHARACTER devnam*9 / '/dev/rst0' /, rec1*512 / "abcd" /
	CHARACTR 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 : 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 は、最初に読み飛ばす EOF マークの数を示す整数です。
nr は、ファイルを読み飛ばした後に読み飛ばす物理レコードの数を示す整数です 。
n は整数の戻り値で、 n=0 のときは正常、 n<0 のときはエラーを示します。
この関数は、まず nf 個の EOF マークをスキップした後、 nr 個の物理レコードをスキップします。 現在のファイルの EOF に位置しているとき、 この EOF は読み飛ばすファイルの 1 つとしてカウントします。 このとき、EOF ステータスフラグはリセットされます。 下の tstate を参照してください。

使用例 : 典型的なプログラム (は 4 つのファイルを読み飛ばした後、 1 つのレコードを読み飛ばします)。 tstate の 2 番目の例も参照してください。

INTEGER nfiles / 4 /, nrecords / 1 /, tskipf, tlu / 1 /
...
n = tskipf( tlu, nfiles, nrecords )
IF ( n .LT. 0 ) STOP "tskipf: cannot skip"

tstate — テープ入出力チャネルの論理ステータスを取得します。

構文 : n = tstate ( tlu, fileno, recno, errf, eoff, eotf, tcsr )
tlu はテープ論理ユニットです。 これは、整数入力引数で、0 から 7 までの範囲でなければなりません。
fileno は、現在のファイル番号を示す整数出力引数です。
recno は、現在のレコード番号を示す整数出力引数です。
errf は、発生したエラーを示す論理出力引数です。
eoff は、現在のファイルが EOF に位置していることを示す論理出力引数です。
eoff が真の間は、 tlu から読み取りを行うことはできません。 tskipf() を使用して 1 つのファイルとゼロ個のレコードを読み飛ばせば、 この EOF ステータスフラグを偽に設定することができます。 n=tskipf( tlu, 1, 0 ) 。これで、その後の有効なレコードを読み取ることができます。
eotf は、テープが論理的なテープの終端に到達したことを示す論理出力引数です。
EOT は、空のファイル (二重 EOF マークと呼ばれることが多い) に よって示されます。 EOT の後ろを読み取ることはできませんが、EOT の後ろに書き込みは できます。
tcsr は、デバイス上のハードウェアエラーを示す整数出力引数です。 これは、テープドライブの制御ステータスレジスタです。 エラーがソフトウェアによるものである場合は、 tcsr にゼロが返されます。
このステータスレジスタに返される値は、 テープドライブのブランドやサイズによって 大きく異なります。 詳細については、 st(4s) を参照してください。
使用例 : それぞれが 2 つのレコードで構成される 3 つのレコードを書き込みます。 この後の例では、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
使用例 : 上の例で書き込んだ 3 つのレコードを読み取るループ内で 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, eoff,
   1                          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 のまとめ

1. EOF または EOT のどちらかに位置する場合、
a. tread() は戻るだけで、テープの読み取りは行わない。
b. tskipf ( tlu, 1, 0 ) は EOF ステータスフラグを偽に設定して戻る。 テープポインタは進めない。
2. twrite() が正常終了すると、 EOF と EOT の 2 つのステータスフラグは偽に設定される。
3. tclose() が正常終了すると、 EOF と EOT の 2 つのステータスフラグは偽に設定される。

tclose() は切り捨て : tclose() は、ユニットポインタの現在の位置の直後に EOF を置いた後、 そのユニットをクローズします。 したがって、 tclose() でユニットをクローズする前に trewin() を使用してユニットの巻き戻しを行うと、 ユニットの内容は破棄されます。 tclose() のこの動作は、Berkeley コードから受け継がれたものです。

注意事項: 廃止事項
このマニュアルページは、履歴情報としてのみ提供されます。 この機能は、Fortran 95 (f95) には実装されません。