アプリ版:「スタンプのみでお礼する」機能のリリースについて

シミュレーションによって得られた計算結果を自動的にgnuplotで
表示させるプログラミングを作成しました。シミュレーション自体は
fortranで行っていてfort.61というファイルが出力されます。
c言語でこのファイルを読みとって、それに少し細工をしfort.62
というファイルに新たに書き込んで、gnuplotで表示させたいのですが、
gnuplotの画面で no valid dataというエラーが表示されてしまいます。
ところが、cのプログラムを終了させてからgnuplotでこのfort.62を
通常の方法でplotすると、きちんとグラフが表示されます。

何が原因がわかるかたいらっしゃいましたら、教えて下さい。
ちなみにコンパイルはcygwin上でgccを使用しています。以下にソース
を添付します。gnuplotで読み込んでいるファイルplot.pltは
「plot "fort.62"」と記述してあるtextファイルです。
よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
    FILE *fp,*fp2;
    int i,N;
    double x,y;
    double volt[100],curr[100];
    double norm,para;
    para = 0.2442E-03;
    N=14;
    fp=fopen("fort.61","r");
    for(i=0;i<N;i++){
      fscanf(fp,"%lf %lf",&x,&y);
      volt[i] = x;
      curr[i] = y;
      if(volt[i] == -1.0){
      norm = para/curr[i];
      }
    }
    for(i=0;i<N;i++){
      curr[i] = norm*curr[i];
    }
  close(fp);
  fp2 = fopen("fort.62","w");
    for(i=0;i<N;i++){
      fprintf(fp2,"%lf %lf\n",volt[i],curr[i]);
    }
    close(fp2);
    system("wgnuplot -persist plot.plt");
}

A 回答 (3件)

私はgnuplotについて何も知らないので、


とんちんかんな解答だったらすみません。

>    double norm,para;
>      if(volt[i] == -1.0){
>      norm = para/curr[i];
>      }

volt[i]がたまたま-1.0になるとき「だけ」normを計算し、
volt[i]が-1.0になることがない場合はnormの値は不定(ゴミ)です。
それでよいのでしょうか?

>    fp=fopen("fort.61","r");
>  fp2 = fopen("fort.62","w");

ファイルをオープンできなかったときの処理が書いてありません。
それでよいのでしょうか?

>  close(fp);
>    close(fp2);

closeという関数は標準関数に見あたりません。
fcloseか何かの間違いでしょうか。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
いつもcloseという関数を使用していました、fcloseだったのですね。
コンパイル中にエラーが出ないので気づきませんでした、貴重な意見
どうもありがとうございました。

お礼日時:2009/01/25 00:01

No.2の方が指摘されているfclose関数をclose関数に間違えているのが原因だと思います。



fprintf関数は出力をバッファリングするため、fprintf関数から復帰してきた時点で
ファイルへの出力が行われていない可能性があります。
正しくfclose関数を呼び出せばバッファ内のデータもファイルへ出力されます。
また、プログラムの終了時には開いたままのファイルに対する処理が行われ
その際にバッファ中のデータもファイルに書き込まれるのだと思います。

gnuloptのエラーメッセージが「no valid data」なので、ファイルは存在していて、
データが全く無いか正しい形式のデータが無いのだと思います。
これは、close関数を誤って使ったためにファイルに全データが書き込まれていないため
発生しているのではないでしょうか。
    • good
    • 0
この回答へのお礼

まったくご指摘の通りでした、僕もファイルの書き込みが正常に終了
していないのではと予想して、close関数の位置をいじったりしてみたの
ですが、まさか、関数自体が間違っているとは気づきませんでした。
大変勉強になりました。どうもありがとうございます。

お礼日時:2009/01/25 00:04

ファイル名がフルパスで書かれていないようですので……


カレントディレクトリがおかしかったりしませんか?

system()で渡しているファイル名をフルパスにする。
plot.plt内で指定しているファイル名をフルパスにする。
とかしたらどうでしょうか?
    • good
    • 0
この回答へのお礼

アドバイスどうもありがとうございます。
おかげさまで、No.2、3の方に指摘頂いた方法で解決できました^^)。

お礼日時:2009/01/24 23:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!