用c++和gnuplot写入文本文件并绘图
Write to a textfile and plot with c++ and gnuplot
我是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并不关心您使用哪一个选项卡
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 已修改的LinkedList未在文本文件本身中更新
- C++文本文件的获取线
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 打印逐行存储的文本文件
- C++文本文件输入