- 締切済み
FORTRANの出力データの左寄せができません。
素数を一万個見つけてそれを規定のフォーマットでTXTファイル出力しなければいけないのですがRANGEの右側の列をハイフンのすぐ隣に左寄せしてファイルに出力したいのですがどうしてもよくわかりません。FやE使って試しましたがエラーが出てコンパイルできなかったです。左寄せ以外にももっと効率のいいコーディングありましたらアドバイスいただけませんか? FORMAT110の真ん中のI6なんですけどこの値が右寄せでTXTファイルに残ります。最初のI6が右寄せでハイフンはさんで二個目のI6が同じ右寄せだとみっともないのです。 110 FORMAT(I6, 1X, ('-'), 1X, I6, T17, 12(2X, I6)) S = 1 L = 12 WRITE (15,110) S, L, P(S:L) DO 60 S = S + 12,10000,12 L = L + 12 IF ( S .EQ. 9985 .AND. L .EQ. 9996) THEN A = S + 12 B = L + 4 WRITE (15,110) A, B, P(A:B) GO TO 99 ELSE WRITE (15,110) S, L, P(S:L) END IF 60 CONTINUE C END IF 99 CLOSE (15) END
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- wakaranan
- ベストアンサー率42% (204/481)
私は20年以上前にFORTRANを使い、その後は全く触れておりませんので今のFORTRANがどうなっているか分かりませんが、ANO1.さんは 「右寄せするためには、文字変数に変換する必要がありますが、そんな関数はありません。」 と書かれてますが、WRITE命令の出力デバイス(通常は6)を文字変数にして、数値変数→文字変数に変換できたと思います。 その文字変数を左カラムからサーチして空白を取り除けば左寄せにした数値(実は文字変数)が得られると思うのですが、今のFORTRANではそのようなことはできないのでしょうか。 CHARACTER*6 CH6 INTEGER NUM WRITE(CH6,100)NUM 100 FORMAT(I6)
内部ファイルで文字列に変換して右詰で出力するだけです。 77fortranで実装されている関数かどうか忘れました。 実装されていない場合にはindex関数でスキャンすれば同じ ことができます。 integer i,i2 character*5 ai,ai2 i=1 i2=12345 write(ai,'(i5)') i write(ai2,'(i5)') i2 write(*,'(a5)') adjustl(ai) write(*,'(a5)') adjustl(ai2) end
お礼
noname#70160さん回答有難うございます。 adjustはFortran77では使えないはずです。次の90からだと思います。もしよければこのやり方を自分のフォーマット110に応用させたものを見せてもらえますか?いろいろ自分のに当てはめて試したんですけどうまくいかなかったです。 たとえば2つくらいの出力なら左側をIを使って右側をFを使うと両方の数字が真ん中に寄ります。 WRIRTE(6,600) (X(I), I = 1、5) 600 FORMAT((/ 'X(' I1 ') =', F10.5) これはIMPLYINGDO-LOOPも使った応用です。こうするといつもは真ん中によってくれるんですけど今回はうまくいってません。
- yyr446
- ベストアンサー率65% (870/1330)
FORTRUN77についての解答ですが、 FORTRUNでは、数値変数は右寄せ、文字変数は左寄せに決まっていて、 これをFORMAT文の出力形式指定で変える事はできません。 右寄せするためには、文字変数に変換する必要がありますが、 そんな関数はありません。 従って実現するためには、数値データをいったんファイル出力し、 そのファイルの数値データ部分を文字として読み込む方法が取れ ます。(スペースの除去も必要) とても面倒です。 もしパソコンでやられているのなら、出力結果はCSVのテキスト ファイルとし、別の表計算ソフト等できれいなアウトプットを作った 方がベターですが、何か事情があるのですね。
お礼
yyr446さん回答ありがとうございます。 コード見てもらったらわかると思いますがただtxtファイルを打ち込むだけでポンと出来上がるような感じを目指しています。まだためしていませんがバイナリーファイルのプログラミングもそのうちやらないといけないのでそのときはそのようなやり方やってみます。
お礼
wakarananさん回答ありがとうございます。 基本的にtxtファイルに書き込みしなければならなのでUNIT NUMBERは15で設定しているのでそれを使って書き込みしなければなりません。あとこのやり方だと全部の出力値が左寄せになってしまうではないでしょうか? 自分は一万個の素数を一行12個ずつ表示させたいのでその素数の数のカウントを1から12、次は13から24という風な感じです。そのカウントのレンジの大きいほうの数字だけ左寄せにしなければなりません。レンジの小さい方の数字と12個の素数は右寄せのままでかまいません。