- ベストアンサー
C言語によるgnuplotの呼び出し
シミュレーションによって得られた計算結果を自動的に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"); }
- みんなの回答 (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か何かの間違いでしょうか。
その他の回答 (2)
- aid-u
- ベストアンサー率75% (22/29)
No.2の方が指摘されているfclose関数をclose関数に間違えているのが原因だと思います。 fprintf関数は出力をバッファリングするため、fprintf関数から復帰してきた時点で ファイルへの出力が行われていない可能性があります。 正しくfclose関数を呼び出せばバッファ内のデータもファイルへ出力されます。 また、プログラムの終了時には開いたままのファイルに対する処理が行われ その際にバッファ中のデータもファイルに書き込まれるのだと思います。 gnuloptのエラーメッセージが「no valid data」なので、ファイルは存在していて、 データが全く無いか正しい形式のデータが無いのだと思います。 これは、close関数を誤って使ったためにファイルに全データが書き込まれていないため 発生しているのではないでしょうか。
お礼
まったくご指摘の通りでした、僕もファイルの書き込みが正常に終了 していないのではと予想して、close関数の位置をいじったりしてみたの ですが、まさか、関数自体が間違っているとは気づきませんでした。 大変勉強になりました。どうもありがとうございます。
- Wr5
- ベストアンサー率53% (2173/4061)
ファイル名がフルパスで書かれていないようですので…… カレントディレクトリがおかしかったりしませんか? system()で渡しているファイル名をフルパスにする。 plot.plt内で指定しているファイル名をフルパスにする。 とかしたらどうでしょうか?
お礼
アドバイスどうもありがとうございます。 おかげさまで、No.2、3の方に指摘頂いた方法で解決できました^^)。
お礼
どうもありがとうございます。 いつもcloseという関数を使用していました、fcloseだったのですね。 コンパイル中にエラーが出ないので気づきませんでした、貴重な意見 どうもありがとうございました。