#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, чтобы узнать, сделано ли это.