質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

1回答

1026閲覧

Fortran 左揃えで桁数が違う場合の読み込み方

Sayuki

総合スコア21

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2018/08/06 02:41

編集2018/08/06 02:42

<実現したいこと>
fortranで下の形式のデータを読み込みたいです.

0001 0.00000e+000 4/PART_4
0158 0.00000e+000 4/PART_4
1179 0.00000e+000 4/PART_4
1180 0.00000e+000 4/PART_4
1181 0.00000e+000 4/PART_4
1449 -2.32840e+000 5/PART_5
1450 -3.48224e+000 5/PART_5
1451 -3.19070e+000 5/PART_5
1452 -2.89924e+000 5/PART_5
1453 -3.58439e+000 5/PART_5
1580 0.00000e+000 5/PART_5
1681 0.00000e+000 5/PART_5

<問題>
真ん中の列が左揃えになっており,下の命令で読み込んだところ,
負号のところでエラーが出ます.

read(*,'(i4,4X,e13.5,a11)')

<質問>
左揃えのデータのデータ長が,負号によって1桁違う場合の読み込み方を教えていただけないでしょうか.
よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スマートなやり方は入力ファイルの桁数をそろえることです。
おそらくファイル作成時にそのような融通が利かないと思われるので、プログラム実行前に変換してしまいましょう。マイナス記号の手前の空白を1つ削ります。
sedが一番楽でしょう。

sh

1$ sed -e 's/ -/-/g' < sample.dat 20001 0.00000e+000 4/PART_4 30158 0.00000e+000 4/PART_4 41179 0.00000e+000 4/PART_4 51180 0.00000e+000 4/PART_4 61181 0.00000e+000 4/PART_4 71449 -2.32840e+000 5/PART_5 81450 -3.48224e+000 5/PART_5 91451 -3.19070e+000 5/PART_5 101452 -2.89924e+000 5/PART_5 111453 -3.58439e+000 5/PART_5 121580 0.00000e+000 5/PART_5 131681 0.00000e+000 5/PART_5

これで、どの行も'(i4,3X,e13.5,a12)'のフォーマット指定で読めるようになります。
e指定子を読む場合、空白が混ざっていても大丈夫です。

入力ファイルをいじれない場合、マイナスがあるかどうかで書式指定子を変えるしかないでしょうか。

fortran

1program hello 2 character(len=33) linebuf 3 integer a 4 real b 5 character(len=12) c 6 7 do 8 read (*, "(A)", end=999 ) linebuf 9 if (linebuf(9:9) == "-") then 10 read(linebuf,'(i4,4X,e13.5,a12)') a,b,c 11 else 12 read(linebuf,'(i4,4X,e12.5,a12)') a,b,c 13 end if 14 print *, a, b, c 15 end do 16 999 print *, "finish." 17end program Hello

一旦linebufに入力データを保存し、9文字目がハイフンかどうかでe指定子の長さを変えています。
この方法だとほかのケースが混ざってきたら都度フォーマットを作らないといけないのでスマートじゃない。
私は前者の方法を強く推します。

投稿2018/08/06 10:52

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sayuki

2018/08/06 15:57

非常に丁寧で分かりやすい説明、ありがとうございました。 このプログラムの使用者はwindows環境で使うそうなので、とりあえずは後者で対応させていただきます。 自分でも、もう少しフォーマットの指定の仕方など研究してみるつもりですので、よりよい方法を見つけた場合はそちらをベストアンサーにさせていただくかもしれませんが、ご了承ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問