Я использую Gnuplot с C ++ для отображения данных из файла .dat, который был изменен в цикле for.
Несмотря на то, что я использую fflush
в каждом цикле для отправки входных команд в Gnuplot, в конечном итоге эти команды выполняются одновременно, когда цикл for завершается и канал Gnuplot закрывается.
Чтобы лучше объяснить проблему, я написал простую программу, которая отображает таблицы умножения от 1 до 10. Каждая таблица хранится в «multiplicationTable.dat», а команда "plot \"multiplicationTable.dat\" using 1:2 w l lw 2 lc rgb 'blue'\n";
отправляется в Gnuplot с fprintf
.
Однако вместо того, чтобы генерировать разные файлы png для каждой таблицы умножения, эта программа генерирует десять одинаковых цифр, все соответствующие 10-й таблице умножения. Как заставить "plot \"multiplicationTable.dat\" using 1:2 w l lw 2 lc rgb 'blue'\n";
выполняться в любом цикле? Я думал, что fflush
сделал работу, но, видимо, я что-то упустил.
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <direct.h>
using namespace std;
int main()
{
// Call gnuplot
FILE* gnuplotPipe = popen("\"C:\\Program Files\\gnuplot\\bin\\gnuplot\" -persist","w");
char* cwd = _getcwd( 0, 0 ); // Store current working directory into string
string stringCwd(cwd);
ofstream outFile; // to store the multiplication tables
string gnuplotCommands;
for(int i = 1; i <= 10; i++)
{
// Define gnuplot commands
stringstream figureNumber;
figureNumber << i;
gnuplotCommands = "reset\n"
"cd '" + stringCwd + "'\n"
"set terminal png size 1920,1080\n"
"set output 'Figure" + figureNumber.str() + ".png'\n"
"set size 0.5,0.5\n"
"set origin 0.25,0.25\n"
"plot \"multiplicationTable.dat\" using 1:2 w l lw 2 lc rgb 'blue'\n";
// Store multiplication table [i*1, i*2, ..., i*10] into .dat file
outFile.open("multiplicationTable.dat",ios::out);
for(int j = 1; j <= 10; j++)
outFile << j << " " << i*j << endl;
outFile.close();
// Write gnuplot commands
fprintf(gnuplotPipe,gnuplotCommands.c_str());
fflush(gnuplotPipe); //flush pipe
}
fprintf(gnuplotPipe,"exit \n"); // exit gnuplot
pclose(gnuplotPipe); //close pipe
return 0;
}