PP#6~Fortran Tips#1
Fortranは文字の取扱いが苦手だ。その為、俺は科学技術計算でC++を使っていた時期もあったが、今は文字列操作を扱う自作Fortranサブルーチンを使っている。この類のコードは巷に出回ってないので役立つこと請け合いですぞ!シリーズでご紹介します。
下記のような入力データを数値データとして読み込ませたことがありますか?
10.0 50.0 50*100.0 100*1000.0
因みに、50*100.0とは実数100.0を50回読ませると言う意味です。
これから数回に亘ってこの課題を一緒にプログラミングしましょう。
初回はこの一連のデータを一度に読み込む(入力する)サブルーチンを作成します。C++では入力ストリームから文字列を行単位で読み込む「getline」関数を使いますが、この関数をFortranで作成します。
下記が俺のコードです。read文の'(a)’で文字列として読み込む仕掛けで、読み込む一行当たりの最大文字数は呼び出す親コードでNLmaxにて設定しています。
subroutine getline(File, Line) !******************************************************************************** !* Read Data in a Line * !******************************************************************************** implicit none integer,intent(in):: File character,intent(inout)::Line*(*) !================================================================================ read(File, '(a)') Line !================================================================================ end subroutine
呼出すサンプルコードはこんな感じです。
program call_getline !******************************************************************************** !* call_getline * !******************************************************************************** implicit none integer,parameter::fin = 5 integer,parameter::NLmax = 130 character(len=NLmax)::inkey !================================================================================ do call getline(fin, inkey) print '("Key to be input (/ to exit)= ", a)', inkey if (inkey == '/') exit enddo print '("Reached end of program")' !================================================================================ stop end program
ところで、出力で一行改行する方法をご存知ですか。
write(File,*)
因みに、C++言語のように一々 “\n” を書かなくても、Fortranではwrite文を 1 回実行する度に行末は改行されます。
つづく