7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FortranAdvent Calendar 2022

Day 11

文字列出力を自動で引用符でくくる

Last updated at Posted at 2022-12-11

本記事では、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 の取りうる引数は

  1. 'none'
  2. 'apostorophe'
  3. '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 さんから別記事に頂いたコメントから着想を得ました。感謝いたします。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?