質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

gnuplotをc言語で使用しようとしているのですが、エラーが出ます。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 6,335

score 12

gnuplotでline 0: warning: Skipping data file with no valid points とエラーが表示されます。

数値計算をしたデータをcsvファイルで出力し、そのファイルをgnuplotでグラフにしようとしているのですが、

line 0: warning: Skipping data file with no valid points
line 0: warning: Skipping data file with no valid points 
line 0: warning: Skipping data file with no valid points  


という表示が出てグラフが出力されません。
解決方法がわかる方いらっしゃいましたら、回答よろしくお願いします。

エラーが出るソースコードを以下に貼ります。

#include <stdio.h>
#include <stdlib.h>
#define GNUPLOT_PATH "C:/gnuplot/bin/gnuplot.exe"
#define FILE_PATH "./plot.csv"
#define J_MAX 100

int main()
{
    int n_max;
    double dx = 0.01, dt = 0.01, c = 0.5, time = 0.0;
    double c_fl, t_max;
    double u[J_MAX+1], u_nn[J_MAX+1], u_ex[J_MAX+1], px[J_MAX+1];
    printf("Input n_max: ");
    scanf("%d", &n_max);
    c_fl = c * dt / dx;
    t_max = (float)n_max * dt;

    for (int j = 0; j <= J_MAX; j++)
    {
        px[j] = dx * j;
        if (px[j] >= 0.2 && px[j] <= 0.4)
            u[j] = 1.0;
        else
            u[j] = 0.0;
    }

    for (int n = 0; n < n_max; n++)
    {
        for (int j = 0; j < J_MAX; j++)
        {
            u_nn[j] = u[j] + c_fl * (u[j+1] - u[j]);
            u[j] = u_nn[j];
        }
        time += dt;
    }

    printf("t = %.2f\n", time);

    for (int j = 0; j <= J_MAX; j++)
    {
        px[j] = j * dx;
        if (px[j] >= 0.2+c*t_max && px[j] <= 0.4+c*t_max)
            u_ex[j] = 1.0;
        else
            u_ex[j] = 0.0;
    }


    FILE *fp;
    fp = fopen(FILE_PATH, "w");
    if (fp == NULL)
    {
        fprintf(stderr, "Oops, i can't find %s.", FILE_PATH);
        exit(EXIT_FAILURE);
    }

    for (int j = 0; j < J_MAX; j++)
    {
        fprintf(fp, "%f, %f, %f\n", px[j], u[j], u_ex[j]);
    }


    FILE *gp;
    gp = _popen(GNUPLOT_PATH, "w");
    if (gp == NULL) 
    {
        fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH);
        exit(EXIT_FAILURE);
    }
    // gnuplotにコマンドを送る
    fprintf(gp, "set xrange [-2.0:2.0]\n");
    fprintf(gp, "set yrange [-2.0:2.0]\n");
    fprintf(gp, "set xlabel 'x'\n");
    fprintf(gp, "set ylabel 'u(x,t)'\n");
    fprintf(gp, "plot 'plot.csv' using 1:2 with lines\n");
    fprintf(gp, "replot 'plot.csv' using 1:3 with lines\n");
    fflush(gp); // バッファに格納されているデータを吐き出す(必須)
    getchar();    // 入力待ち
    _pclose(gp);
    fclose(fp);
    exit(EXIT_SUCCESS);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

gnuplot では標準では CSV を受け付けません。

set datafile separator comma


するか、出力内容にスペースも入れたままなら

set datafile separator " ,"


とする。

separator を設定しないなら出力部分を

fprintf(fp, "%f, %f, %f\n", px[j], u[j], u_ex[j]);


ではなくて

fprintf(fp, "%f %f %f\n", px[j], u[j], u_ex[j]);


とすることでも解決しますね。


プログラムを動かすと fclose の位置が悪いためにファイルが出力される前の段階で gnuplot に読み込ませていますね。データ出力が完了したら fclose してしまいましょう。

    for (int j = 0; j < J_MAX; j++)
    {
        fprintf(fp, "%f %f %f\n", px[j], u[j], u_ex[j]);
    }
    fclose(fp);


それでデータを読み込むことはできるようになります。あとは最後のキー入力待ちが正しく動作しません。入力バッファをクリアした後で getchar で待ちましょう。

    rewind(stdin);
    getchar();    // 入力待ち

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 20:45 編集

    回答の最後に記載してある通り、getchar の前に rewind してみましょう。または、fgets で止めるのもありかと思います。それなら Enter キー押すまで進まないので。

    キャンセル

  • 2019/05/26 15:32

    fgets は引数の指定が面倒なので、再度 scanf("%d", &n_max); で止めても良いかと思います。

    キャンセル

  • 2019/05/27 08:46

    ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る