マニュアルページ 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) には実装されません。