• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FORTLANです。)

プログラムで数値データの読み込み方法についての質問

このQ&Aのポイント
  • プログラムで数値データを読み込む際に、小数点の位置が変わる場合のformat指定方法について質問です。
  • format(f7.5, e8.2)やformat(e7.5, e8.2)といった指定を試しましたが、セグメンテーション違反が発生してしまいます。
  • 正しいformat指定の方法をご教示いただきたいです。

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

  • ベストアンサー
  • kai714
  • ベストアンサー率100% (2/2)
回答No.7

小数点の位置の変化とformatの指定に関してですが、入力データにちゃんと小数点(ピリオド)が入っていれば、f7.5でもf7.3でも構いません。それによって読み込んだ値が100倍になったりするわけではありません。というわけで普通はf7.0のように書きます。小数点がない場合はf7.3で読み込んだ値がf7.5で読み込んだときの100倍になるので注意が必要です。 それからEタイプで書かれている実数もわざわざEタイプでformatを指定する必要はありません。e8.2ではなくてf8.2でもf8.0でも大丈夫です。 つまり、実数の読み込みに関しては、fx.0(xは桁数)で済んでしまうことになります。 見方を変えれば、当初のformat文(f7.5,e8.2)でも正しいformatですので、桁数が合っていれば少なくとも最初のenergyとcountは正しく読めているはずです。 「セグメンテーション違反」が出るのは別の理由だと思われますので、もう少し詳しいソース、使用しているコンパイラ、コンパイル時のオプション、OSなどを示していただけたら回答してもらえるのではと思います。

huwahuwasan
質問者

お礼

ご指摘の通りでした。 FORMATだけにこだわっていたのですが、配列やサブルーチンなどが原因でした。 お蔭様でデータを読み込むことができましたのでこの場を借りてアドバイス下さった皆様にお礼申し上げます。

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

その他の回答 (6)

回答No.6

#1です。 >分けるという作業はとてもできないのです。 全部分けろと言っているのではなくて、簡単なファイルを用意し、それが読み込めるかどうかチェックしてみて欲しいという意味です。 たとえば、 1.11111 2.22222 3.33333 4.44444 を read(*,10) energy 10 format(f7.5) で読み込めるのか? 読み込めたなら、 1.11111 22.2222 333.333 4444.44 ならどうなるのか? と言う風に、順番に検討していけばエラーの原因が見えてくるのではないかと思ったのです。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4853/10268)
回答No.5

>一行に >energy count energy count energy count >というように3組になっていて、それが15000列ほど続いています。 >それを >read(2,10) (E(i),C(i),i=1,NP)←NPはデータ数です。 >10format(f7.5,e8.2,f7.5,e8.2,f7.5,e8.2) >というふうに書きました。 もしかして、NPは3x15000にしてますか?ひとつのread文では1行しか読めない(少なくとも昔は)はずです。 do 10 n=1,NP,3 read(2,*) (E(i),C(i),i=n,n+2)I 10 continue でどうでしょう?

全文を見る
すると、全ての回答が全文表示されます。
  • 530529
  • ベストアンサー率16% (86/521)
回答No.4

確か、入力数値に小数点が有ればそちらが優先されるので昔は符号、小数点、数値の合計のけた数だけ書いて、小数点以下の桁数は”0”としていました。 今回だとF7.0でよいかと思います。 あと、次の数値との間に1桁空いていますがそこは符号が来るとすれば、E9.2でどうでしょうか ? もし空いているところが空白なら1Xを間に入れて、 F7.0、1X、E8.2 (このときも、E9.0とかE8.0でもいいかも) こうかいていると大昔にパンチカードを使っていた頃によく間違えたのを思い出します。

huwahuwasan
質問者

補足

みなさんのご協力ほんとうにありがとうございます。 せっかくなのですがまだうまくいっていません。 実は質問のときには省略してしまったのですが、 読み込みたいデータというのは、 一行に energy count energy count energy count というように3組になっていて、それが15000列ほど続いています。 それを read(2,10) (E(i),C(i),i=1,NP)←NPはデータ数です。 10format(f7.5,e8.2,f7.5,e8.2,f7.5,e8.2) というふうに書きました。 編集記述子をいろいろ変えてみたのですがダメみたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4853/10268)
回答No.3

1行が16文字なのにformatで指定している長さの合計が15文字なのがまずそうに思います。 format指定せずに、 read(*,*) energy,count でどうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

シンプルにREADして、暗黙に型変換させるとか: REAL*8 energy REAL*8 count CHARACTER LINE(4)*17 DATA LINE(1) / '1.11111 1.00E+01' / DATA LINE(2) / '22.2222 2.00E+01' / DATA LINE(3) / '333.333 3.00E+01' / DATA LINE(4) / '4444.44 4.00E+01' / INTEGER i DO i=1,4 READ( LINE(i), * ) energy, count PRINT *, energy, count END DO END FSF-g77で試してます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

10 format(f8.5,e8.2) か 10 format(f7.5,e9.2) にしてみてください。 だめなら、データを分けて、 1.11111 22.2222 333.333 4444.44 read(*,10) energy 10 format(f7.5) と 1.00E+01 2.00E+01 3.00E+01 4.00E+01 read(*,10) count 10 format(e8.2) で正常に読みこめるのかチェックしてください。

huwahuwasan
質問者

お礼

アドバイスありがとうございます。 しかし、データが450000個もあるので 分けるという作業はとてもできないのです。 まとめて読み込みたいと思っています。

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

関連するQ&A

  • FortranのFormatについて

    Fortranで数値を出力するときのFormatについて質問です。 数値を小数点を無くして、指数表示で出力したいです。 例えば 0.0025 を 25E-4 と出力するのが希望です。 調べたところ、 『■pe■.■e■』(■は数値)というFormatにすれば、  1番目の値は小数点以上の桁数  2番目の値は数値が入る幅  3番目の値は小数点以下の幅  4番目の値は指数の桁数 ということがわかりました。 『2PE8.3e1』だと 0.0025 は 25.00E-4 と出力されます。 『2PE6.1e1』だと 0.0025 は 25.E-4 と出力されます。 しかし、この小数点を消す方法がどうしてもわかりません。 『2pe6.0e1』と設定してもうまく出力されません。 詳しい方がいらっしゃったらぜひ教えてください。 よろしくお願いします。

  • 「セグメンテーション違反」について

    参考書に載っていたプログラムを打ち込みながら勉強していたのですが、次のプログラムを動かしたときに「セグメンテーション違反」と出てきました。 /* 可変書式による印字_簡単な棒グラフ */ #include <stdio.h> main() { char *f, *a; int i; f="%2d = %-20.1s\n"; a="********************"; for(i=1; i<10; i++){ *(f+11)=i+'0'; printf(f,i,a); } } コンパイル後に、 「セグメンテーション違反です」 と、表示されて終わってしまいます。 何処が問題だったのでしょうか???教えて頂ければ幸いです。

  • PHPのセグメンテーション違反に対する例外処理について

    PHPのセグメンテーション違反に対する例外処理について 再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで  $ php error_seg.php と実行しました。 実行環境: PHPのバージョン:5.2.10 Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010 プログラムは下記の通りです。 <?php $cnt=0; function func(){ global $cnt; $cnt++; print $cnt . "回目の呼び出し\n"; func(); } try{ func(); }catch(Exception $e){ echo "例外発生:" . $e->getMessage()."\n"; } ?> ※このプログラムは、   http://d.hatena.ne.jp/syonbori_tech/20090414/1239717538  のサイトを参考にして作りました。 この結果、  1回目の呼び出し  2回目の呼び出し  ・・・  26187回目の呼び出し  26188回目の呼び出し  セグメンテーション違反です と表示され、セグメンテーション違反を再現させました。 ※何回目でセグメンテーション違反が発生するかは、  その都度異なります。 プログラム中で、try-catchの例外処理を入れたのですが、 例外処理されないようです。セグメンテーション違反に対して 例外処理をすることはできないのでしょうか。 できるとすれば、どのように記述をすればよいでしょうか。

    • ベストアンサー
    • PHP
  • エクセルデータのカウント

    A1:E5にデータが入力してあります。(空白セルもあり) C列、D列、E列のどれか1つのセルにでもデータ(数値) が入っている行の数をカウントして、A6に表示する 方法を教えてください。 たとえばF列に、=COUNT(C1:E1)を計算する行を入れて、 A8で=COUNTIF(F1:F5,">=1")をすれば、できるのだと思うのですが、 そのために行を増やしたくないのです。

  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • エクセルで数値の桁数を一定の法則で統一したい

    E列にA~D列のデータから計算された数値が並んでいます。 たとえば E1:9.9 E2:86.08695652 E3:212.8571429 E4:1158.13953488372 これらを E1:9.90 (整数1桁の場合は四捨五入して小数2桁まで)       1未満の数値も小数2桁で(例、0.96) E2:86.1 (整数2桁の場合は四捨五入して小数1桁まで) E3:213  (整数3桁の場合は四捨五入して小数カット) E4:1158 (整数4桁の場合は四捨五入して小数カット) 上記の法則で見やすく整理したいのです。 整数4桁が最大です。大量のデータをまとめて整理出来る方法は ないでしょうか?よろしくお願いします。

  • カウントアップ

    以前質問させて頂いた続きなのですがまた詰まってしまったので 知恵をお借りしたいと思います。 File Count.java public class Count { public int read(){ return 1; } public void write(int count){ (1) } } File Test.java //カウント処理 Count count = new Count(); int scount = count.read(); contribute.setAttribute("no", ""+scount); scount = scount+1; count.write(scount); Test.javaファイルにおいて変数scountを使用する際に 1~10と読み込むたびに数字を一つづつ足していくという処理を行いたいのです。 (1)の部分にソースを書くことまでは指定されており、ここまでは間違えていないと言われているのですが(1)の部分をどんな風に作成すれば良いかがわかりません。 どのように書けば良いのでしょうか?? よろしくお願いします。

  • FORTRAN77

    助けてください~ --------------------------------------- 華氏゜Fが与えられた時、摂氏℃と絶対温度Zを求めよ C=(5/9)(F-32),Z=C+273.16 ここで華氏゜Fは書式カードF1.5でカードに用意されていて、数値999.9のデータを読み込んだら終わりとする。 ただし、華氏゜Fの値は、-50.0゜Fから200.0゜Fまで10.0゜Fごとに変化させる。 --------------------------------------- で、私が頑張って(っていっても教科書を見ながら)書いたのが以下です。 --------------------------------------- * write(6,200) 200 format(1h ,8x,1hf,10x,1hc, 9x,1hz) 10 read(5,100)f 100 format(f5.1) if(f.eq.999.9)stop c=(f-32.0)*5.0/9.0 z=c+273.16 write(6,201)f,c,z 201 format(1h ,3(5x,f5.1)) go to 10 end ------------------------------------- 100 formatの下からdo文を使うのが狙いかと思いますがよくわかりません。 ちなみに参考教科書は入力データが ------------------------------------- 32.5 135.5 68.3 999.9 ------------------------------------- となっていました。多分これは使わないです。 よろしくお願いします(><)

  • java:読み込んだデータの確認

    javaを使って通信のプログラムをつくっています。 送信側でバイトデータを作成して送信します。そして受信側でそのバイトデータを読み込みます。 送信側で作ったバイト数が本当に受信側に届いたかのチェックをするには、 どうすればよいでしょうか?下のコードは、自作した受信処理です。 調べると、read(byte[] b,int off,int len)の返り値が読み込んだバイト数ということなので、 これを使うのではないかと思うのですが、どう使えばよいか分かりません。下のコードは、とりあえず、受信したらcount++として受信処理分だけ countを増やして受信したバイトを数えています。 readの返り値で受信したバイト数を取得するには、どうすればよいでしょうか? 御教授お願いします。 送信側 BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); for (int i = 0; i < Data; i++) {   for (;;) {     try {       out.write(i);       out.flush();       count++;       break;     } catch (IOException e) {       System.err.println((count + 1) + "つ目のバイト:書き込みエラー>>再書き込み");     }   } } 受信側 BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); int ch = 0; // 読み込んだ文字 int Count = 0; // 届いたバイト数のカウンター while (ch != -1) {   try {     ch = in.read(); Count++;   } catch (IOException e) {     System.err.println(Count + "つ目のバイトデータ:読み込みエラー");   } }

    • ベストアンサー
    • Java
  • Javaでの数値の表示について

    Javaで FORTRANのFORMAT文 WRITE(*,100) X 100 FORMAT(F10.4) やCの printf("%10.4f",x); のように桁数を指定して数値を表示する方法を 教えて下さい。