Гнуплот, с ++ из windows.командное окно открывается и закрывается - PullRequest
6 голосов
/ 19 февраля 2012

У меня есть следующее, и независимо от того, что я пытаюсь, командное окно открывается и закрывается снова.Графики не отображаются, файлы не записываются.Любой, у кого есть решение использовать gnuplot из c ++.У меня есть и 4.4 и 4.6rc1 доступны.

#ifdef WIN32
  gp = _popen("C:\Program Files (x86)\gnuplot\bin\pgnuplot.exe", "w");
#else
  gp = popen("gnuplot -persist", "w");
#endif


 if (gp == NULL)
       return -1;

  /* fprintf(gp, "unset border\n");
  fprintf(gp, "set clip\n");
  fprintf(gp, "set polar\n");
  fprintf(gp, "set xtics axis nomirror\n");
  fprintf(gp, "set ytics axis nomirror\n");
  fprintf(gp, "unset rtics\n");
  fprintf(gp, "set samples 160\n");
  fprintf(gp, "set zeroaxis");
    fprintf(gp, "  set trange [0:2*pi]");*/


  fprintf(gp, "set term png\n");
  fprintf(gp, "set output \"c:\\printme.png\"");
  fprintf(gp, "plot .5,1,1.5\n");
   fprintf(gp, "pause -1\n");

     fflush(gp);

Ответы [ 2 ]

7 голосов
/ 25 декабря 2012

Следующая программа была протестирована в Windows с использованием компиляторов Visual Studio и MinGW, а также в GNU / Linux с использованием gcc. Двоичный файл gnuplot должен находиться по пути, а в Windows должна использоваться версия двоичного файла pgnuplot.

Я обнаружил, что каналы Windows намного медленнее, чем соответствующие каналы в GNU / Linux. Для больших наборов данных передача данных в gnuplot по каналу в Windows медленная и часто ненадежная. Более того, код ожидания нажатия клавиш более полезен в GNU / Linux, где окно графика закроется после вызова pclose().

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

// Tested on:
// 1. Visual Studio 2012 on Windows
// 2. Mingw gcc 4.7.1 on Windows
// 3. gcc 4.6.3 on GNU/Linux

// Note that gnuplot binary must be on the path
// and on Windows we need to use the piped version of gnuplot
#ifdef WIN32
    #define GNUPLOT_NAME "pgnuplot -persist"
#else 
    #define GNUPLOT_NAME "gnuplot"
#endif

int main() 
{
    #ifdef WIN32
        FILE *pipe = _popen(GNUPLOT_NAME, "w");
    #else
        FILE *pipe = popen(GNUPLOT_NAME, "w");
    #endif

    if (pipe != NULL)
    {
        fprintf(pipe, "set term wx\n");         // set the terminal
        fprintf(pipe, "plot '-' with lines\n"); // plot type
        for(int i = 0; i < 10; i++)             // loop over the data [0,...,9]
            fprintf(pipe, "%d\n", i);           // data terminated with \n
        fprintf(pipe, "%s\n", "e");             // termination character
        fflush(pipe);                           // flush the pipe

        // wait for key press
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin.get();

        #ifdef WIN32
                _pclose(pipe);
        #else
                pclose(pipe);
        #endif
    }
    else
        std::cout << "Could not open pipe" << std::endl; 
return 0;
}
3 голосов
/ 20 января 2015

Конечно, следующий ответ очень похож на ответ Николаса Кинара, единственное добавленное замечание - как правильно сохранить файл .png.Также пара предложений:

  1. Если путь ввода содержит пробелы, он не будет работать.В Windows 8, использующей Visual Studio 2013, он показывает ошибку "C:Program" is not recognized as an internal or external command....
  2. Если вы не упомянули какой-либо путь вывода, он печатает и сохраняет в каталоге самой программы C ++.Таким образом, вы должны проверить правильный формат для пути вывода, так как gnuplot не показывает никакой ошибки, трудно определить точную причину.

Ниже приведена полная программа на C ++, которая прекрасно работаетв Visual Studio 2013 в Windows 8.1

#include <cstdio>
#include <iostream>
int main()
{

    FILE* pipe = _popen("C:/gnuplot/bin/pgnuplot.exe", "w");
    if (pipe != NULL)
    {
        fprintf(pipe, "set term win\n");
        fprintf(pipe, "plot(x, sin(x))\n"); //a simple example function
        fprintf(pipe, "set term pngcairo\n");
        fprintf(pipe, "set output \"myFile.png\"\n" );
        fprintf(pipe, "replot\n");
        fprintf(pipe, "set term win\n");
        fflush(pipe);
    }
    else puts("Could not open the file\n");
    _pclose(pipe);
    //system("pause");
    return 0;
}
...