• ベストアンサー

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"); }

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

私は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か何かの間違いでしょうか。

knobcreek
質問者

お礼

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

その他の回答 (2)

  • aid-u
  • ベストアンサー率75% (22/29)
回答No.3

No.2の方が指摘されているfclose関数をclose関数に間違えているのが原因だと思います。 fprintf関数は出力をバッファリングするため、fprintf関数から復帰してきた時点で ファイルへの出力が行われていない可能性があります。 正しくfclose関数を呼び出せばバッファ内のデータもファイルへ出力されます。 また、プログラムの終了時には開いたままのファイルに対する処理が行われ その際にバッファ中のデータもファイルに書き込まれるのだと思います。 gnuloptのエラーメッセージが「no valid data」なので、ファイルは存在していて、 データが全く無いか正しい形式のデータが無いのだと思います。 これは、close関数を誤って使ったためにファイルに全データが書き込まれていないため 発生しているのではないでしょうか。

knobcreek
質問者

お礼

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

ファイル名がフルパスで書かれていないようですので…… カレントディレクトリがおかしかったりしませんか? system()で渡しているファイル名をフルパスにする。 plot.plt内で指定しているファイル名をフルパスにする。 とかしたらどうでしょうか?

knobcreek
質問者

お礼

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

関連するQ&A

  • C言語からgnuplot呼び出し

    C言語からgnuplotを呼び出したいのですが、一瞬表示されてすぐ消えてしまいます。 プログラムは以下のように書きました。 --------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char **argv) { FILE *gid; int i; double x; gid=popen("gnuplot -persist","w"); for (i=0; i<100 ;i++){ x = 0.03*i; fprintf(gid,"plot sin(x-%f*pi)\n",x); } pclose(gid); } --------------------------------------------------------------- この後、 gcc test.c -lm ./a.out でコンパイル、実行しました。 かなり初心者なので初歩的な質問かもしれませんがよろしくお願いします。

  • gnuplotについて質問です。

    現在、linuxでC言語からパイプを使ってgnuplotに接続し、計算した結果をすぐに表示しようとしています。 下のようなプログラムでうまくいくと思ったのですが、グラフが表示されるのにすごい時間がかかってしまいます。 解決策をご存知でしたらご教示お願いいたします。 #include<stdio.h> #include<stdlib.h> #include<math.h> void main(){ FILE *plotin; double x , y; int i = 0; struct sched_param param; struct timespec tt; //gnuplotにパイプで接続 plotin = popen("gnuplot","w"); //制御LOOP開始 for(i = 0 ; i < 1000 ; i ++) { if( i == 10000) { exit(0); } //gnuplotで表示するグラフの計算 x = i * 0.01; y = x*x; //gnuplotに表示する fprintf(plotin,"plot '-' title \"oscillation\" \n"); fprintf(plotin,"%f %f\n", x,y); fprintf(plotin,"e\n"); i++; } //gnuplot閉じる pclose(plotin); }

  • C言語(線形リスト)

    #include <stdio.h> #include <string.h> typedef struct { char name[100]; double height, weight; } HW; int main (void) { FILE *fp; int i, ninzu = 0; char name[100]; double height, weight; double hsum = 0.0; double wsum = 0.0; HW class[100]; if ((fp = fopen ("hw.dat", "r")) == NULL) { perror ("\a ファイルをオープンできません。\n"); exit (1); } else { while (fscanf (fp, "%s %lf %lf", class[ninzu].name, &(class[ninzu].height), &(class[ninzu].weight)) == 3) { ninzu++; } for (i = 0; ninzu > i; i++) { printf ("%-10s %5.1f %5.1f\n", class[i].name, class[i].height, class[i].weigh t); hsum += class[i].height; wsum += class[i].weight; } printf ("----------------------------------------\n"); printf ("平均 %5.1lf %5.1lf\n", hsum / ninzu, wsum / ninzu); fclose (fp); } return (0); } このプログラムを100人分のデータをファイルから読み込んで線形リストにするにはどのようにプログラムを改良すれば良いのでしょうか?

  • gnuplotデータを編集してプロット

    gnuplotでデータを編集してプロットしようと思い、 set datafile separator "," plot 'test.csv' using 1:($4*2) with lines と打ちました。 これを、gnuplotに直接打つとうまくいくのですが、これをtest.pltというファイルに保存して、 call 'test.plt' と、実行すると、 gnuplot> call 'test.plt' gnuplot> plot 'PIDtorque.csv' using 1:(*2) with lines                     ^ "test.plt", line 2: invalid expression と、表示されます。 これは何故なのでしょうか? 宜しくお願いします。

  • C言語についてです。

    EXELEファイルから値を読みこんで、各自のBMIと全体の身長・体重の平均値を求めるプログラムを作成したいんですが…C言語で…。途中までで混乱してしまい、あっているかも分からないのでお願いしたいです。よろしくお願いします。ヒントだけでもありがたいです。 下がそのファイルです。 height weight 170.7 52.9 166.8 71.3 171.4 58.5 173.4 76.7 176.1 80.2 184 89.1 179 64.7 177.2 78.5 177.7 80.7 173.8 64 167.7 60.3 181.6 72.3 162.4 53 177.4 69.6 178 76.4 174 77.2 185.4 86 172 68.5 172.7 60 166.5 62 171.3 69.6 177 79 174.8 82.6 167.5 69.2 176.8 80.1 181.5 76 177.3 76.4 169.4 51.8 165.2 73.2 175.3 72.3 181.5 72.4 171.5 68.8 176 73.2 186 99.8 167.3 65.5 176.1 78 183.3 77.2 177.5 59.5 180.3 62 171.2 74.7 175 87.2 176 80 171.8 50.6 平均身長の値を出すプログラムは出ているので…これもあわせてBMIと平均体重出してくれるとうれしいです。 /* basic claculation */ #include <stdio.h> #include <math.h> int main(void) { int i, ii; int ntotal; double sum_height; double weight[50], height[50]; double mean_height; char w[6],h[6]; FILE *fp; /* initial setting */ /* ntotal: total word number */ /* sum : total character number */ ntotal = 0; sum_height = 0; /* file open */ /* my data file is weight-height.data */ /* which is in my root directory */ fp = fopen("./weight-height.data","r"); /* skip character reading. */ fscanf(fp,"%s,%s",w,h); /* ntotal: total number */ /* sum : total value */ for (i=0;i<=47;i++) { if (feof(fp)) break; fscanf(fp,"%lf,%lf",&weight[i],&height[i]); printf(" weight = %lf height = %lf \n",weight[i],height[i]); sum_height = sum_height + height[i]; } fclose(fp); ntotal = i; printf(" 全人数 = %d \n",ntotal); mean_height = sum_height /ntotal; printf(", 平均身長 = %lf \n",mean_height); return(0); }

  • C言語の質問です。

    前にも質問したのですがなかなかうまくいかないのでよろしくお願いします。 データの書いてあるファイルを読み込んで処理するプログラムを書きたいと考えています。 読み込むデータ 0.012500 0.499167 1.382500 1.534444 2.489167 3.635000 3.775000 5.407500 5.705000 5.916667 6.115833 6.295278 6.825278 7.079722 . . . . この様な数値のかいてあるデータを使って0.5ずつに区切ってその中に何個データがあるか数えたいと考えています。(データは1万5千個以上あります) 例えば上のデータで考えると 0~0.5の範囲のデータは2個 0.5~1の範囲のデータは0個 1~1.5の範囲のデータは1個 1.5~2の範囲のデータは1個 2~2.5の範囲のデータは0個。。。 という風に数えるプログラムにしたいです。 僕が分からないところはどのように場合分けしていくか。。。です。 #include<stdio.h> //#include<process.h> int main(void) { FILE *fp; double n; int cnt,i,Cnt; fp=fopen("1.dat","r"); if(fp==NULL) { printf("file open error!!\n"); exit(1); } i=0; cnt=0; Cnt=0; while(fscanf(fp,"%lf\n",&n)!=EOF){ if(i<=n<(i+0.5)){ cnt++; printf("%lf %d\n",i,cnt); } else if((i+0.5)<=n<(i+1)){ Cnt++; printf("%lf %d\n",i,Cnt); } else{ i++; } } fclose(fp); return 0; } 僕の考えはデータを読み込む 変数 i を使って if文で i <= n <i+0.5の範囲のときはcntを足していく     i+0.5<= n <i+1の範囲のときはCntを足していく それ以外のときは i を+1して同じことを繰り返す というようなやり方を考えました。 しかしうまくいきませんでした。 どのようにすればよいでしょうか。 よろしくお願いします。

  • C言語の計算についての質問です.

    C言語の計算についての質問です. 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 というようなファイルを行ごとに読み込んで、列ごとの和を算出させたいと考えています. 以下のようなプログラムをテスト作成してみたのですが,『 b=1のときのa[1] + b=2のときのa[1] 』のような計算ができません. どのようなプログラムを作成すればこの問題が解決できるか教えてください. #include <stdio.h> #include <string.h> int main(void) { FILE *fp; int i, j, k, no, b; double a[12]; double c[3]; char buffer[1024]; for(i=1; i<=2; i++) { sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10); printf("%s \n", buffer); fp = fopen(buffer,"r"); for(b=1; b<=12; b++) { fscanf(fp, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[9], &a[10], &a[11], &a[12]); printf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[9], a[10], a[11], a[12]); } for(b=0; b<=2; b++){ c[3]=a[b] + a[b+1]; printf("%lf", c[3]); putchar('\n'); } fclose(fp); } return (0); }

  • C言語のプログラミングで困っています

    C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、  絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000];   double d[50000];   double e[50000]; int n = 0;   int m = 0;   int i = 0;   char fname[80];   char fname2[80]; printf("ファイル名 : ");    gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : ");    gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • C言語 ファイルの読み込みについて

    以下のようなプログラムを実行します \nで改行が行われません。なぜでしょうか? #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("arm_x.csv","r"); while(1) { fscanf(fp,"%lf%lf\n",&a,&b); printf("%f::%f\n",a,b); count++; if(count==10)break; } fclose(fp); } csvファイルは 0.0 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5・・・ 0.2 0.3 0.4・・・・・・・・・ : : です。 実行結果はこのようになってしまいます。 0.0 0.1 0.2 0.3 0.4 0.5 : :