J’ai le suivant, et peu importe ce que j’essaie, une fenêtre de commande est ouverte et fermée à nouveau. Aucun graphique n’est affiché, aucun fichier n’est écrit. Toute personne ayant une solution pour utiliser gnuplot à partir de c ++. J’ai les deux 4.4 et 4.6rc1 disponibles.
#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);
Le programme suivant a été testé sur Windows avec les compilateurs Visual Studio et MinGW, ainsi que sur GNU / Linux avec gcc
. Le binary gnuplot
doit être sur le chemin, et sous Windows, la version pgnuplot
du binary doit être utilisée.
J’ai trouvé que les pipes Windows sont beaucoup plus lents que ceux sous GNU / Linux. Pour les grands ensembles de données, le transfert de données vers gnuplot
via un canal sous Windows est lent et souvent peu fiable. De plus, le code d’attente en attente de touche est plus utile sous GNU / Linux, où la fenêtre de traçage se ferme une fois que pclose()
a été appelé.
#include #include #include // 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; }
Bien sûr, la réponse suivante est assez similaire à celle de Nicholas Kinar, le seul point ajouté est comment enregistrer correctement le fichier .png
. Aussi quelques suggestions:
"C:Program" is not recognized as an internal or external command....
gnuplot
ne montre aucune erreur, il est difficile de trouver la raison exacte. Voici le programme complet C ++ qui fonctionne parfaitement sous Visual Studio 2013 sous Windows 8.1.
#include #include 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; }