愛しの Fortran・3改

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

書式付き流れ探査入出力 (その4)

改行文字による改行

書式付き流れ探査出力では、「改行文字」(newline character) を出力することにより、 現在記録へのデータ転送を終了して、続く出力が新たな記録を作成するようにできます (つまり改行されます、前回の用語で言えば、現在位置に記録マーカが書かれます)。

      WRITE(UNIT,"(*(G0))") &
       "First line", NEW_LINE(""), "Second line"

これの出力結果は

First line
Second line

です。 組込み関数 NEW_LINE は引数と同じ種別の文字型の「改行文字」を返します。 ちなみに改行文字は ASCII コードの(十進)10 番、 C で言えば「'\xa'」(つまり「'\n'」)と決められています。

普通に順番探査出力でも「'\n'」を書けば改行されるだろ、と思ったアナタ。

      WRITE(*,"(*(G0))") &
       "First line", ACHAR(10), "Second line"

Unix 系では上と同じ出力結果。) 微妙に違うことに注意してください。順番探査出力では、1 つの記録内(同じ行内) の 1 文字として ACHAR(10) が出力されます。 その結果、改行されて記録が 2 つになって見えるとしたら、それは実は規格外の動作です。 「処理系は、書式付き記録において、幾つかの制御文字の使用を禁止してもよい」 という規定によって、処理系は記録内に ACHAR(10) を入れることを禁止しているのを、 規格外の処理系依存の動作をさせているのです。

Windows 系の Fortran 処理系で同じコードを実行させたときに、ACHAR(10) を CR-LF ペアに変換する処理系もあれば、そのまま LF だけにする処理系もあるかもしれません。 そもそも ACHAR(10) を書式付き記録内に書くのは規格外(と処理系が決めた)なので、 どちらの動作をするも規格は感知しない。 その上で利便性から ACHAR(10) が出力された場合の処理系依存動作が実装されてきた、 という経緯があったのです。 これが Fortran 2003 の書式付き流れ探査の導入で、ACHAR(10) の出力は、 その文字そのものを記録内に書くのではなく、そこで改行する意味で使えるようになったのです (ちなみにこれが「ほぼ上位互換」の「ほぼ」の意味です)。

改行文字が NEW_LINE("") という関数になっているのは、 基本文字型でない文字型によるファイル出力時にも同じ仕組みを使うためです。

次回は POS 指定子によるファイル位置の指定です。

(つづく)