Gnuplot, c ++ à partir de Windows. La fenêtre de commande s’ouvre et se ferme

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:

  1. Si le chemin d’entrée contient des espaces, cela ne fonctionnera pas. Dans Windows 8 à l’aide de Visual Studio 2013, une erreur "C:Program" is not recognized as an internal or external command....
  2. Si vous ne mentionnez aucun chemin de sortie, il est imprimé et enregistré dans le répertoire du programme C ++ lui-même. Vous devez donc vérifier le bon format pour le chemin de sortie, car 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; }