ToDo:
Q編集記述子は、すでに調べた通りベンダー拡張なので 使うべきでは有りません。read文に置いては、Q編集記述子が 表れた時点でバッファ無いに有る文字数を返すので(Q,A)と 書けば、読み込んだ文字列の長さが判るわけです。 Fortranの文字列仕様(変数のサイズは固定でも中身のサイズが判らない)で パーサー書くには必須とも言える機能なので、新しいFortranには 同等の機能が無いはずは無いと思うのですが...やはり有りました(w
Fortran90の停留入出力での入力で、
integer :: nc character(len=256) :: s read(lfno, fmt='(A256)', advance='no', size=nc) s
という構文が使えます。ここでは、 sは長さ256の文字列バッファに 入力lfnoから改行・ファイル終端が来るか最大256文字読み込むまで 読み込み、読み込んだ文字数を ncに格納します。 停留入力なので、改行が来る前に書式指定の終端に達した場合は、 ファイルポインタはそこで停止します。 つまり、入力を1文字づつ読み込むことも可能です。
これ自身は、Fortran90規格に有るので g95でも使えるのが味噌
ただし、改行は特別扱いなので unibyte-stream入力には 厳しいですね。もちろん、改行記号が特定1-character のみな処理系なら改行を検知したところで、バッファに自前で 改行記号を送り込めば良いわけですが、移植性がありませんね (改行記号が1-characterでもCRかLFかそれ以外かは環境依存)
実際、Fortran I/O libraryが気を利かせている実装の場合、unix上でも CR-LFのシーケンスを改行記号に扱ったり(例えばg95/gfortran)、 単独のCRに対して次のLFを読みにいってCR+LFで無い場合は 改行記号扱いし次の一文字は読み飛ばしたままだったり(例えばgfortran) するのでunibyte-stream入力を停留入力で扱うのは難しそうです。
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記