Gnuplot, c++ from windows. command window opens and closes

前端 未结 2 686
Happy的楠姐
Happy的楠姐 2020-12-30 12:12

I have the following, and no matter what i try a command window is opened and closed again. No plots are shown, no files are written. Anyone who have a solution to use gnupl

2条回答
  •  我在风中等你
    2020-12-30 12:53

    The following program has been tested on Windows using the Visual Studio and MinGW compilers, as well as on GNU/Linux using gcc. The gnuplot binary must be on the path, and on Windows, the piped pgnuplot version of the binary must be used.

    I've found that Windows pipes are much slower than the corresponding ones on GNU/Linux. For large datasets, transferring data to gnuplot over a pipe on Windows is slow and often unreliable. Moreover, the key press waiting code is more useful on GNU/Linux, where the plot window will close once pclose() has been called.

    #include 
    #include 
    #include 
    
    // Tested on:
    // 1. Visual Studio 2012 on Windows
    // 2. Mingw gcc 4.7.1 on Windows
    // 3. gcc 4.6.3 on GNU/Linux
    
    // Note that gnuplot binary must be on the path
    // and on Windows we need to use the piped version of gnuplot
    #ifdef WIN32
        #define GNUPLOT_NAME "pgnuplot -persist"
    #else 
        #define GNUPLOT_NAME "gnuplot"
    #endif
    
    int main() 
    {
        #ifdef WIN32
            FILE *pipe = _popen(GNUPLOT_NAME, "w");
        #else
            FILE *pipe = popen(GNUPLOT_NAME, "w");
        #endif
    
        if (pipe != NULL)
        {
            fprintf(pipe, "set term wx\n");         // set the terminal
            fprintf(pipe, "plot '-' with lines\n"); // plot type
            for(int i = 0; i < 10; i++)             // loop over the data [0,...,9]
                fprintf(pipe, "%d\n", i);           // data terminated with \n
            fprintf(pipe, "%s\n", "e");             // termination character
            fflush(pipe);                           // flush the pipe
    
            // wait for key press
            std::cin.clear();
            std::cin.ignore(std::cin.rdbuf()->in_avail());
            std::cin.get();
    
            #ifdef WIN32
                    _pclose(pipe);
            #else
                    pclose(pipe);
            #endif
        }
        else
            std::cout << "Could not open pipe" << std::endl; 
    return 0;
    }
    

提交回复
热议问题