Tôi đã xem xét điều này trong khi tìm kiếm nội dung khác liên quan đến gnuplot. Mặc dù đó là một câu hỏi cũ, tôi nghĩ tôi sẽ đóng góp một số mã mẫu. Tôi sử dụng nó cho một chương trình của tôi, và tôi nghĩ nó có một công việc khá gọn gàng. AFAIK, PIPEing này chỉ hoạt động trên các hệ thống Unix (xem bản chỉnh sửa bên dưới dành cho người dùng Windows). Cài đặt gnuplot của tôi là cài đặt mặc định từ kho lưu trữ 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
Trong ứng dụng của tôi, tôi cũng chạy vào các vấn đề mà cốt truyện không xuất hiện cho đến khi chương trình gọi điện thoại được đóng lại. Để giải quyết vấn đề này, hãy thêm fflush(gnuplotPipe)
sau khi bạn đã sử dụng fprintf
để gửi lệnh cuối cùng của mình.
Tôi cũng thấy rằng người dùng Windows có thể sử dụng _popen
thay cho popen
- tuy nhiên tôi không thể xác nhận điều này vì tôi chưa cài đặt Windows.
EDIT 2
Người ta có thể tránh được việc phải viết vào một tập tin bằng cách gửi gnuplot lệnh plot '-'
tiếp theo điểm dữ liệu tiếp theo là chữ "e".
ví dụ:
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");
lẽ kiểm tra 'chức năng system'. – sje397