用c++和gnuplot写入文本文件并绘图

Write to a textfile and plot with c++ and gnuplot

本文关键字:文本 文件 绘图 c++ gnuplot      更新时间:2023-10-16

我是c++的新手,我试图将脚本的输出写入文本文件,并使用gnuplot绘制输出。脚本如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <fftw3.h>
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
int main(void)
{
    int i;
    double y;
    int N=256;
    double Fs=30000;//sampling frequency
    double  T=1/Fs;//sample time 
    double f=5000;//frequency
    double *in;
    fftw_complex *out;
    double t[N-1];//time vector 
    fftw_plan plan_forward;

    in = (double*) fftw_malloc(sizeof(double) * N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

    for (int i=0; i< N;i++)
    {
        t[i]=i*T;
        in[i] =0.7 *sin(2*M_PI*f*t[i]);// generate sine waveform
        double multiplier = 0.5 * (1 - cos(2*M_PI*i/(N-1)));//Hanning Window
       in[i] = multiplier * in[i];
      }
    plan_forward = fftw_plan_dft_r2c_1d ( N, in, out, FFTW_ESTIMATE );
    fftw_execute ( plan_forward );
    for ( i = 0; i < N; i++ )
    {
    printf ( "  %4d  %12fn", i, in[i] );
    }
fftw_destroy_plan ( plan_forward );
fftw_free ( in );
fftw_free ( out );
return 0;
}

输出是i和in[i]

作为将输出写入文本文件的第一次尝试,我将以下代码添加到主函数内的脚本中:

fstream myfile;
myfile.open ("example.txt");
  for(i = 0; i < N; ++i)
    { myfile << i << std::endl;
      myfile << in[i] << std::endl;
    }
myfile.close();

我在两列中找不到I和in[I],所以我输入了

./Nameofthefile >stdout.txt 2>stderr.txt

在终端中现在我在stdout。txt文件中有I和in[I]并排放在两列中像这样:

 1      0.000092
 2      0.000368

等等。当我输入

gnuplot "stdout.txt"

在终端我得到这个错误:

0      0.000000
^
"stdout.txt", line 1: invalid command

我有两个问题:

1-如何修复这个错误

2-如何把i和在[i]在两列并排在我的"example.txt"。就像我在stdout。txt里看到的那样。谢谢。

一些头文件不建议用于C++。要使用C标准库头文件的C++版本,您可以指定名称前缀为c,而不带.h扩展名。

这些:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

将成为:

#include <cstdlib>
#include <cstdio>
#include <ctime>

您的问题是您没有提供gnuplot绘制图形所需的所有内容。您提供了原始数据,但没有说明如何处理这些数据。

你需要输出一个像这样的文件:

plot '-' using 1:2
1 0.000092
2 0.000368

所以你可以像这样在你的原始程序中添加plot命令:

printf("plot '-' using 1:2n"); // add this
for(i = 0; i < N; i++)
{
    printf("%4d  %12fn", i, in[i]);
}

或者在你的其他例子中像这样:

std::fstream myfile;
myfile.open("example.txt");
myfile << "plot '-' using 1:2" << std::endl;
for(i = 0; i < N; ++i)
{
    myfile << i << " " << in[i] << std::endl;
}
myfile.close();

可以使用以下命令绘制输出文件:

gnuplot -p < "stdcout.txt"

您已经为gnuplot创建了一个数据文件。但是,gnuplot需要使用自己的语言编写脚本,然后使用plot命令(或类似命令)实际生成数据文件的图。阅读gnuplot文档

要得到两列,只需在它们之间插入一个空格:

myfile << i << " " << in[i] << std::endl;

您也可以使用选项卡"t",这可能会在查看文件时产生更好的显示效果,但是gnuplot并不关心您使用哪一个选项卡