Я столкнулся с этим, ища что-то еще относительно gnuplot. Несмотря на то, что это старый вопрос, я думал, что внес свой пример кода. Я использую это для моей программы, и я думаю, что это довольно красивая работа. AFAIK, эта PIPEing работает только в системах Unix (см. Ниже приведенное ниже для пользователей Windows). Моя установка gnuplot является установкой по умолчанию из репозитория Ubuntu.
#include <stdlib.h>
#include <stdio.h>
#define NUM_POINTS 5
#define NUM_COMMANDS 2
int main()
{
char * commandsForGnuplot[] = {"set title \"TITLEEEEE\"", "plot 'data.temp'"};
double xvals[NUM_POINTS] = {1.0, 2.0, 3.0, 4.0, 5.0};
double yvals[NUM_POINTS] = {5.0 ,3.0, 1.0, 3.0, 5.0};
FILE * temp = fopen("data.temp", "w");
/*Opens an interface that one can use to send commands as if they were typing into the
* gnuplot command line. "The -persistent" keeps the plot open even after your
* C program terminates.
*/
FILE * gnuplotPipe = popen ("gnuplot -persistent", "w");
int i;
for (i=0; i < NUM_POINTS; i++)
{
fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]); //Write the data to a temporary file
}
for (i=0; i < NUM_COMMANDS; i++)
{
fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]); //Send commands to gnuplot one by one.
}
return 0;
}
EDIT
В моем приложении, я также столкнулся с проблемой, что сюжет не появляется, пока вызывающая программа не будет закрыта. Чтобы обойти это, добавьте fflush(gnuplotPipe)
после того, как вы использовали fprintf
, чтобы отправить его окончательную команду.
Я также видел, что пользователи Windows могут использовать _popen
вместо popen
- однако я не могу подтвердить это, поскольку у меня нет установленной Windows.
EDIT 2
можно избежать того, чтобы записать в файл, отправив Gnuplot в plot '-'
после команды точками данных, за которой следует буква «е».
например.
fprintf(gnuplotPipe, "plot '-' \n");
int i;
for (int i = 0; i < NUM_POINTS; i++)
{
fprintf(gnuplotPipe, "%lf %lf\n", xvals[i], yvals[i]);
}
fprintf(gnuplotPipe, "e");
Может проверить 'system' функцию. – sje397