Как выполнить несколько команд GNUplot с помощью popen() в C?

#c #gnuplot #popen

Вопрос:

это мой первый вопрос здесь! Я пытаюсь создать динамический график, который периодически обновляется с помощью GNUplot через C. Вот пример кода для того, что я пытаюсь сделать

 #include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    FILE *data,*flsrt;
    FILE *gnupipe;
    int i=0,j=0,k=0;
    data=fopen("dat2.dat","w");
    flsrt=fopen("t1.txt","r");
    fprintf(data,"%dt%dn",i,j);
    gnupipe=popen("gnuplot -persistent","w");
    char *GNUC1[]= {"plot 'dat.dat' using 2:1 with lines","reread","replot"};
    fprintf(gnupipe,"%sn",GNUC1[0]);
    while(k<5000)
    {
        fprintf(data,"%dt%dn",  i,  j);
        //fprintf(gnupipe,"%sn",GNUC4);
        fprintf(gnupipe,"%sn",GNUC1[1]);
        fprintf(gnupipe,"%sn",GNUC1[2]);
        k  ;
    }
   return 0;
}
 

Тем не менее, конвейер, кажется, портится после нескольких итераций, и я продолжаю получать эту ошибку:
Ошибка
Я понятия не имею, как это исправить, буду признателен за любую помощь!

Комментарии:

1. Я думаю, вы забыли опубликовать фактическую ошибку. Если бы вы могли отредактировать это, нам было бы легче помочь вам.

2. Было ли это перепечатано и скопировано неправильно? FILE data, flsrt; не должно компилироваться, так и должно быть FILE * . Кроме того, вы записываете данные dat2.dat , но dat.dat вместо этого выводите содержимое. Как только они будут исправлены, вам, вероятно, нужно будет что-то сделать fflush .

3. Спасибо, я действительно забыл связать изображение, и я также исправил опечатку. Что касается «флашинга «, не могли бы вы поподробнее, пожалуйста?

4. stdio выполняет такие функции, как fprintf буферизация своих данных, и не обязательно записывает их в пункт назначения позже. Чтобы заставить его быть выписанным, используйте fflush (см. Его документацию). Вам нужно fflush(data) после записи data убедиться, что новые данные действительно попадают туда, и fflush(gnupipe) после отправки команд убедиться, что gnuplot увидит их перед следующей итерацией.

5. У вас также есть условие гонки, заключающееся в том, что нет никакой гарантии, что gnuplot завершит построение одной версии файла до того, как вы обновите его снова. Это сложнее исправить, потому что я не знаю, есть ли какой-либо способ «запросить» gnuplot, чтобы узнать, сделано ли это.