# マニュアルページ twrite.3f

## 名前

         topen, tclose, tread, twrite, trewin, tskipf, tstate -  FOR-
         TRAN テープ入出力 (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 を参照してください。

         使用例 : 典型的なプログラム (m は 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) には実装されません。