このマニュアルページは、歴史的理由を示すためだけに提供されています。この機能は、Fortran 95 (f95) には実装されていません。
これらの関数を使用すると、FORTRAN から磁気テープを操作できます。
どのユニットでも、これらの関数を標準の FORTRAN 入出力と混在させないでください。
まず、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 のサイズです。
例: 2 レコードのファイルを書き込む。
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: 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 に達した場合は、スキップするファイルの 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 が true の場合は、該当する tlu から読み込むことができません。tskipf() を使用して、この EOF ステータスフラグを false に設定すると、1 個のファイルとゼロ個のレコードをスキップできます (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, 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 ) は、EOS ステータスを false にリセットして、元に戻ります。テープポインタは前進しません。
twrite() が正常終了すると、EOF と EOT のステータスフラグが false にリセットされます。
tclose() が正常終了すると、すべてのステータスフラグが false にリセットされます。
tclose() は切り捨てを行います。tclose() は、ユニットポインタの現在の位置の直後に EOF マーカーを配置してから、ユニットを閉じます。したがって、tclose() を使用してユニットを閉じる前に、trewin() を使用してユニットを巻き戻すと、その内容が破棄されます。このような tclose() の動作は、Berkeley コードから継承されています。
このマニュアルページは、歴史的理由を示すためだけに提供されています。この機能は、Fortran 95 (f95) には実装されていません。