愛しの Fortran・3改

Fortran について気の向くままに綴ります

OPEN 文の ACTION 指定子 (後編)

前編では、ACTION 指定子の指定は省略しない、ということを書きました。 その理由が ACTION 指定子の既定値は処理系依存だから、なのですが、 ではなぜ処理系依存なのか。 少し欲張ったからなのです。

ACTION 指定子は決意表明で、表明したことで起きることはすべて処理系依存です。 一方、処理系はファイルの読み書き属性を(ユーザー権限も含めて)管理しているものです。 なので OPEN 文での ACTION 指定子の指定が、処理系が知る事情も含めて OPEN 文の成否に反映されることも期待されます。

つまり ACTION="READ" は規格上は WRITE 文に指定しない、 という決意表明ですが、処理系は「入出力誤り条件の集合は、処理系依存とする」 を適用して、OPEN 時に読み出し権限を確認する機会にできます (ACTION="WRITE" も同様)。

こちらの見方からすると、ACTION の指定値はファイルの性質によって決まります。 つまり読み出し権限のないファイルには WRITE しか指定できませんし、 書き込み権限のないファイルは READ でなければなりません。 どちらの権限もあれば READWRITE にできます (あるいはどちらかの権限があれば READWRITE にできる?)。 どれが適切かは処理系にしかわからないので、 だから ACTION の既定値は処理系依存にせざるをえなかった、ということでしょう。

OPEN 文で ACTION 指定子を省略したとき(しなかったときもですが) INQUIRE 文で ACTION 指定子の値を問い合わせることができます。

      INQUIRE(UNIT,ACTION=ACTION)

(指定子右辺の ACTION は長さ 5 文字以上の基本文字変数)。

また、ファイルの読み書きの権限があるかも INQUIRE 文で問い合わせができることになっています。

      INQUIRE(FILE="A",READ=READ,READWRITE=READWRITE,WRITE=WRITE)

(指定子右辺の READREADWRITEWRITE はそれぞれ長さ 1 文字以上の文字変数)。 ACTION="READ" で接続できるファイルは READ"YES"、そうでなければ "NO"、 不明なら "UNKNOWN" が返されます。 READWRITEWRITE も同様です。

ちなみに、筆者の使っているある処理系では

  • 書き込み権限のないファイル → READREADWRITEYESWRITENO

  • 読み出し権限のないファイル → READREADWRITENOWRITEYES

  • どちらもないファイル → 3 つとも NO

  • どちらもあるファイル → 3 つとも YES

となりました。

(おわり)