代码之家  ›  专栏  ›  技术社区  ›  Josh

在没有用户输入的情况下用C++调用GNU情节

  •  0
  • Josh  · 技术社区  · 8 年前

    我在网上找到了这个密码。它使用C++中生成的数据使用GnU情节进行绘图。但是,它需要用户输入,没有这些行就不能工作

          printf("press enter to continue...");        
          getchar();
    

    错误消息显示

         line 0: warning: Skipping unreadable file "tempData"
         line 0: No data in plot
    

    有人知道怎么解决这个问题吗?我想在循环中使用此代码,而不是每次都调用它来输入…

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    void plotResults(double* xData, double* yData, int dataSize);
    int main() {
    int i = 0;
    int nIntervals = 100;
    double intervalSize = 1.0;
    double stepSize = intervalSize/nIntervals;
    double* xData = (double*) malloc((nIntervals+1)*sizeof(double));
    double* yData = (double*) malloc((nIntervals+1)*sizeof(double));
    xData[0] = 0.0;
    double x0 = 0.0;
    for (i = 0; i < nIntervals; i++) {
        x0 = xData[i];
        xData[i+1] = x0 + stepSize;
    }
    for (i = 0; i <= nIntervals; i++) {
        x0 = xData[i];
      yData[i] = sin(x0)*cos(10*x0);
    }
    plotResults(xData,yData,nIntervals);
    return 0;
    }
    void plotResults(double* xData, double* yData, int dataSize) {
    FILE *gnuplotPipe,*tempDataFile;
    char *tempDataFileName;
    double x,y;
    int i;
    tempDataFileName = "tempData";
    gnuplotPipe = popen("gnuplot","w");
    if (gnuplotPipe) {
      fprintf(gnuplotPipe,"plot \"%s\" with lines\n",tempDataFileName);
      fflush(gnuplotPipe);
      tempDataFile = fopen(tempDataFileName,"w");
      for (i=0; i <= dataSize; i++) {
          x = xData[i];
          y = yData[i];            
              fprintf(tempDataFile,"%lf %lf\n",x,y);        
          }        
          fclose(tempDataFile);        
          printf("press enter to continue...");        
          getchar();        
          remove(tempDataFileName);        
          fprintf(gnuplotPipe,"exit \n"); 
          pclose(gnuplotPipe);   
      } else {        
          printf("gnuplot not found...");    
      }
    } 
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Claes Rolen    8 年前

    我认为实际的问题是你提前删除了临时文件。我会将代码重组为:

    if (gnuplotPipe) 
    {
        // Create the temp file
        tempDataFile = fopen(tempDataFileName,"w");
        for (i=0; i <= dataSize; i++) 
        {
            x = xData[i];
            y = yData[i];            
            fprintf(tempDataFile,"%lf %lf\n",x,y);        
        }        
        fclose(tempDataFile);  
    
        // Send it to gnuplot
        fprintf(gnuplotPipe,"plot \"%s\" with lines\n",tempDataFileName);
        fflush(gnuplotPipe);
        fprintf(gnuplotPipe,"exit \n"); 
        pclose(gnuplotPipe); 
    
        // Clean up the temp file  
        remove(tempDataFileName);        
    } 
    

    这样,系统上就不会有很多临时文件。

    另一个好的方法是使gnuplot持久化,这样您就可以在管道关闭后看到绘图,只需添加一个 -p 打开管道时标记

    gnuplotPipe = popen("gnuplot -p","w");