• ベストアンサー

FORTRAN で出力した文字の 左寄せについて

C Pad for Salford FTN77というコンパイラを使っております。 下記の様にOPENで開いてCLOSEでとじたTEXT文についてですが… WRITE(*,*) '入力した数に1プラスされます。' READ (*,*) A B=A+1 OPEN(UNIT=10,FILE='C:\001.txt') WRITE(10,100) '入力したのは',A WRITE(10,100) '1たすと',B 100 FORMAT(A) CLOSE(10) STOP …計算もされず、左寄せにもなりません。 仮に「100 FORMAT(A)」を消して(10,100)を(10,*)にすると左寄せにはなりませんが 計算して結果は表示されます。 計算して結果を左寄せにするにはどうすればよいでしょうか。 ご存知の方、アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#65504
noname#65504
回答No.3

私が知っているfortranは77なのでもしかすると違っているかもしれませんが、 先ず変数Aは型宣言がないので実数扱いになります。 B=A+1(正確に記述するなら1ではなく1.) が計算されることからもそういえます。 つぎに、FORMAT(A)の中のAは文字型を出力する際にし要するものですので、変数の型が一致していません。だから出力されないのだと思います。またAの後に桁数を示す数字が必要です。 実数に対してはFORMAT(F8.1)とかFORMAT(E8.3)とかのFやEを使用する必要があります。 また数値型の場合プラスマイナスの記号が入ることから、正値の場合+記号が省略されて、代わりにブランクが出力されたと思います。すなわち1つ目はブランクになります。 FORMAT(F1.0)等とすると桁オーバーを意味する*が出力されます。 整数型にしておけば1桁の場合FORMAT(I1)としておけば、左の1桁目に数字が出ますが、2桁以上やマイナス値のある数字の場合この方法は使用できません。 ブランクを取りたい場合、文字型で出力しなければなりませんが、たしかfortranには数値型データを文字型データに変換するコマンドがありません。 他の方法もあるかもしれませんが、そこで、一度数値データとしてファイルに出力して、そのファイルから文字型データとして1文字ずつ読み取るという方法で私自身は対処していました。 たしかこんな感じでした。 CHARACTER*1 H(8) 文字型と配列宣言 WRITE (10,601) A 601 FORMAT(F8.2) BACKSPACE(10) READ(10,602) (H(I),I=1,8) 602 FORMAT(8A1) この後H(I)がブランクなら出力しない、ブランクでなければ出力するという判定作業を行って、ブランク以外の値が入っているI番目から後ろの値全部を文字型出力をします。 記憶が薄いので、上のとおりしてもうまくいきませんかもしれませんが、数値データを文字型データにうまく変換してやればできると思います。

astro1995
質問者

お礼

アドバイスありがとうございます。 対処方法まで教えていただきまして感謝しております。 FORMAT(A)に対する認識が甘かったようです。 文字型データへの変換に対してもう少し勉強してみます。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.4

ANSIのFORTRAN77の規定では(最新はわかりません)、FORMAT文では、A型は左寄せ、それ以外は右寄せとなっています。 ですから、プログラマが意識しないと(実際は文字変数に一度ENCODEして操作する)それ以外の変換は出来ません。 すでに指摘がありますが、このFORMATでは実数は出力できませんよ。F型かE型の変換を追加する必要があります。WRITE(10,*)はリスト型変換で、変数の型に従って変換するのでうまくいったのです。 あと、FORTRANには、長い歴史の中でのデファクトスタンダードがあり、UNIT=10には通常書き込みません(読み込みデータに使う)、ご自分の範囲では問題はないと思いますが、今後、実用として使う際には意識した方がよいですよ。 暗黙の型宣言には従うというのも含めて。

astro1995
質問者

お礼

アドバイスありがとうございました。 いろいろ間違いがあったことに気づきました。 それとF型とE型のFORMATについて調べてみます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

format が write の引数より少ないときには format の先頭から繰り返したような記憶があるので, 今の例だと各 write の 2つの引数をどちらも A (文字) で出力しようとするはずです. でも, 変数の A や B は文字 (列) じゃないのでうまく出力できないんじゃないかなぁ? ちなみに FORTRAN で左詰めをするなら, 1回は文字 (列) 変数で受けないといけないような気がします. 少なくとも Fortran ではどうしようもなかったような.

astro1995
質問者

お礼

アドバイスありがとうございます。 実際Bにあたる部分はもっと複雑な計算なので、どうしてもFORTRANでプログラムしたいのです。 引数は1つにできそうなので、もう少し自分でも考えて見ます。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> WRITE(10,100) '入力したのは',A > WRITE(10,100) '1たすと',B > 100 FORMAT(A) write で引数を二つ渡しているのに、formatの指定には引数指定は一つしかないので 計算結果が出力されていないだけではないでしょうか? またFortranのformatでは、整数や浮動小数点数を何桁で出力するかという 指定はできても、それを左寄せにするかどうかという指定はできなかったと 思います。

astro1995
質問者

お礼

アドバイスありがとうございます。 Fortranを始めたばかりの初心者ですが、とても参考になりました。

すると、全ての回答が全文表示されます。

関連するQ&A