本記事では、Fortran の write 文で文字列を書き出すときに、その前後に自動的にアポストロフィまたはクォーテーションマークを付ける方法を紹介します。
Fortran の list-directed I/O での空白入り英文字列の扱いが楽になります。空白の入った英文字列などを、CSV ファイルで出すときにも便利かと思います。
Open 文による属性の変更
まずプログラムと実行結果を示します。
三回 print *, 'This is a pen.' を繰り返しますが、open 文で delimiter 属性を変えることによって出力文字列が '' や "" によって囲まれるようになります。
プログラム
program strings
use, intrinsic :: iso_fortran_env, only : output_unit
implicit none
print *, 'This is a pen.'
open(unit = output_unit, delim = 'apostrophe')
print *, 'This is a pen.'
open(unit = output_unit, delim = 'quote')
print *, 'This is a pen.'
end program strings
実行結果 gfortran
This is a pen.
'This is a pen.'
"This is a pen."
iso_fortran_env 中の output_unit
いまここで Fortran 標準出力の属性変更を行っています。標準出力は古くは 6 番にあてられていて、のちに unit = * が推奨されるようになりました。最近 Fortran 2008 以降では intrinsic module の iso_fortran_env の中の output_unit に番号が定義されています。
print 文も標準出力に出力することになっていますので、output_unit の属性を変えると print 文の出力結果も変化します。
ところが intel fortran では output_unit の属性を変えても write(*, *) や print の属性が変わりませんでした。コンパイラの問題だとは思いますが・・・
open 文の delim 属性
open 文の中には delim (delimiter) 属性があって、これを変えることで文字列を自動で引用符で囲めます。delim の取りうる引数は
- 'none'
- 'apostorophe'
- 'quote'
の三種類で、それぞれ 1.引用符無し、2.アポストロフィ('')、3.クオーテーションマーク("") となります。デフォルト値は 'none' になっています。
例題では標準出力を用いましたが、一般的なファイルでも delim は使えます。
多重 open
Fortran の open 文は close せずに開くと、基本的には勝手に close して新たに open します。しかし特定の場合には、単なる属性変更になります。delim はこの属性変更の例になっています。上記プログラムでもいちいち close せずに、次々 open しています。
これに関してはややこしい規則があるので Dr. Fortran こと Steve Lionel 氏の記事を参照してください。
まとめ
以上、Fortran の write 文で文字列を書き出すときに、その文字列の前後に自動的にアポストロフィまたはクォーテーションマークを付ける方法を紹介しました。
Fortran の list-directed I/O での読み込み時は、コンマまたは空白を区切り文字にするので、空白入りの英文字列があると単語ごとに区切られてしまいますが、英文字列が引用符で囲まれていると全体を1個の要素と見なします。この様な場合 delim を用いると出力時にいちいち英文字列を囲む引用符を write 文につけずに済むので便利かと思います。
謝辞
この記事は、最近 implicit_none さんから別記事に頂いたコメントから着想を得ました。感謝いたします。