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);

下面爲最終效果圖

這裏寫圖片描述

第一次寫博客,望包涵,謝謝支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章