C语言实现信号打包成二进制文件并在Matlab中读取并画图(VS版)

C语言实现信号打包成二进制文件并在Matlab中读取并画图(VS版)

前些天老师布置了一道作业:在main.cpp里面生成了两个信号s1和s2,将这两个信号的数据用二进制形式写到文件signal.dat里面,然后用Matlab从该文件中读取信号的数据,将两信号画在一张图中

main.cpp

include<'vector.h'>
using namespace std;
int main()
{
    int N = 100;
    double t;
    vector<double> s1(N), s2(N); //定义两个大小为100的向量数组
    for(int i = 0; i < N; i ++) {
        t = i * 0.1;
        s1[i] = t * t - 2 * t;
        s2[i] = - t * t + 2 * t;
    }
    system("pause");
}

老师已经在main.cpp中用向量定义了两个数组s1,s2用于储存信号,接下来要做的工作就是把两个数组写入二进制文件中。首先先学习一下两个重要函数:

fread函数和fwrite函数

1.函数功能

用来读写一个数据块。

2.一般调用形式

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

3.说明

(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

(2)size:要读写的字节数;

(3)count:要进行读写多少个size字节的数据项;

(4)fp:文件型指针。

    FILE *fp = NULL;
    errno_t err;
    const char *filename1 = "signal.dat";       //定义二进制存放处
    err = fopen_s(&fp,filename1, "wb");        //使用fopen_s()函数以wb形式打开文件
    if (fp == NULL)
    {
        printf("无法打开文件!");
        return 0;
    }
    fwrite(s1, sizeof(s1), 1, fp);          //写入信号s1
    fwrite(s2, sizeof(s2), 1, fp);          //写入信号s2
    fclose(fp);        //关闭数据流,防止数据丢失

此次需要主要的地方是在VS编辑器中fopen()函数是不安全的,编辑器不提倡使用,而是改用更加安全的fopen_s()函数。在定义二进制文件地址时可以是一个没有该文件的地址,在运行程序时将自动生成。最后需要关闭数据流fp。下面附上fopen_s()函数第三个参数定义:

r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
rb+ 读写打开一个二进制文件,只允许读写数据。
rt+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

在完成上述操作后,信号写入二进制文件就已经完成。接下来是Matlab读取二进制文件了。

首先使用fopen(‘文件地址’,’读取模式’);打开二进制文件,使用fread()函数读取该文件,下面为函数介绍

fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:

[A,COUNT]=fread(fid,size,precision)

说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。

下面为Matlab代码:

fip=fopen(‘文件地址’,’读取模式’);

[Array_2D,num]=fread(fip,[100,2],’double’);%inf表示读取文件中的所有数据,[M,N]表示将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中

fclose(fip);

plot(Array_2D);

下面为最终效果图

这里写图片描述

第一次写博客,望包涵,谢谢支持!

猜你喜欢

转载自blog.csdn.net/zdy_lyq/article/details/78006731