Как использовать цикл для вывода данных из файлов, используя Gnuplot с C ++? - PullRequest
0 голосов
/ 01 сентября 2018

Я использую 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;
}
...