Ich stieß auf diese während der Suche nach etwas anderes in Bezug auf gnuplot. Obwohl es eine alte Frage ist, dachte ich, ich würde etwas Beispielcode beisteuern. Ich benutze das für ein Programm von mir, und ich denke, es macht einen ziemlich sauberen Job. AFAIK funktioniert dieses PIPEing nur auf Unix-Systemen (siehe unten für Windows-Benutzer). Meine Gnuplot-Installation ist die Standardinstallation aus dem Ubuntu-Repository.
#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
In meiner Anwendung, lief ich auch in das Problem, dass die Handlung nicht, bis das rufende Programm geschlossen wird, erscheint. Um dies zu umgehen, fügen Sie eine fflush(gnuplotPipe)
hinzu, nachdem Sie fprintf
verwendet haben, um es Ihren letzten Befehl zu senden.
Ich habe auch gesehen, dass Windows-Benutzer _popen
anstelle von popen
verwenden können - aber ich kann das nicht bestätigen, da ich Windows nicht installiert habe.
EDIT 2
Man kann vermeiden, durch die Buchstaben „e“, gefolgt von Datenpunkten, gefolgt von Senden gnuplot den plot '-'
Befehl in eine Datei zu schreiben.
z.B.
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");
Vielleicht die 'system' Funktion überprüfen. – sje397