找回密码
 注册
关于网站域名变更的通知
查看: 468|回复: 2
打印 上一主题 下一主题

怎样在Matlab中读取和写入二进制数据

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-19 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
6 O+ [* g* L2 h7 I1 V4 w: j
Matlab中关于二进制数据文件操作所使用的语言是标准的C,有关数据文件的编程方法与LabVIEW类似。
# _) F' Q9 w8 n$ c7 k1 e4 C; J. G# l
3 P( D& z8 Z$ q4 x  Q. L* n' }1、文件的打开与关闭9 `% s6 g, I- d' F# a$ j5 k2 m
1)打开文件3 L$ r- q0 y+ i) w. W# s3 V  |
在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:7 G; ]3 y- T# ]
fid=fopen(文件名,‘打开方式’)
! s7 ?" ^. w: Y' T! X说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:2 ?: o& B, F1 J7 z$ J
‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
' \' e& g% N. [6 B; }1 o6 U. ^ ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。1 f4 K" X" J+ S5 C
‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
6 w9 I, }9 R! a6 S& z ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。4 w# E3 ^: z2 l! k
‘a’:在打开的文件末端添加数据。文件不存在则创建。
# p$ Y  C6 z4 Q' G0 K2 [! a0 R ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。; U1 y: ~  f% a% y
另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。
6 K* Z6 U/ l' K% b6 e  l& A6 O& @& w2)关闭文件- r3 {# Q4 t: x) p$ ~
文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:
/ O  q7 N7 ^9 a% j# Ssta=fclose(fid)
- e0 z9 X1 C: |+ a1 \2 c' O; A& L说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
( O- D# m6 d% S! R  x2、二进制文件的读写操作
0 c/ j; _* d8 ^. }1)写二进制文件- A" Z0 T2 V! r/ |# X3 J
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:" q! l, N/ ?, {" k) n7 g4 E
COUNT=fwrite(fid,A,precision)
& n4 w2 y, H, Y2 N5 @0 u5 ^- M说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。: l  O' C- n( Y" r& Z- K6 W
例6.8 将一个二进制矩阵存入磁盘文件中。2 d; t! b$ P. u: H8 F$ U8 G: b
>> a=[1 2 3 4 5 6 7 8 9];
" ^* U0 ?$ y; M3 y; x) N! z" e>> fid=fopen('d:\test.bin','wb')   %以二进制数据写入方式打开文件
& {* O+ E; f0 E1 Ufid =' A0 q7 ~" U: J2 k. m: S) p
  3           %其值大于0,表示打开成功7 y8 i, H9 M, ?8 p: M! T; l% P5 [  }
>> fwrite(fid,a,'double')
' \& n' q* I3 @, H' f* h' M9 Nans =- ~% R" h/ r9 m& Q( U
  9           %表示写入了9个数据( I: A: W* Z9 ]8 R. U8 ~8 a
>> fclose(fid)- V8 T9 X! Q* x2 P; h- T
ans =        6 Z& }+ c/ r/ \6 C: n
  0           %表示关闭成功
) q4 j. Y# w, O: z, ?$ C7 }8 U" f! K' x2)读二进制文件! G0 O- n' k" G8 A
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
! o" p3 k3 u5 Q9 K( z0 r- C2 H/ b[A,COUNT]=fread(fid,size,precision)
+ T& A1 c$ l: d说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
7 c9 O" Y6 Z9 r1 |) z; {% }4 j
2 @, C9 ]* ~2 f1 G- j5 x%写一维数据至数据文件
7 j1 V9 i% X; `" m6 J% }0 [5 Z. T) K3 ]7 _n=0:pi/10:4*pi;
* u" B; @+ u# N. Ky=sin(n);
9 H4 X1 }8 \/ u. Hfip=fopen('C:\binary3.bin','wb');# b/ ?5 ]7 s: N4 `0 M
fwrite(fip,Pxx,'double');3 Y+ O. L, t- h7 H2 |/ j. i
fclose(fip);+ a9 U7 P4 u0 N, w+ h

& E. b' k. T  F2 u4 E%从数据文件读取一维数据
: y# ^, e. z0 e# L% [. k) v# tfip=fopen('C:\binary3.bin','rb');6 ~# Z' I9 `5 f% {  |' [4 k+ l
[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示9 n9 q; u7 C* d/ E( ?
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中- D" J8 q/ I8 V" F' S& Z  i
fclose(fip)9 P) y1 Y: D9 V2 C( Y
1 a  e$ }: h* M2 f* X* M# h1 [
%写二维数据至数据文件
) _/ ~+ b% i6 }. g7 K5 g5 Zn=0:pi/10:4*pi;
2 E/ Y! O& t- i7 i: v9 ?/ A4 Gy1=sin(n);y2=sin(n);y3=0.5*sin(n);
0 k& x& B- f/ Y$ Hy=[y1;y2;y3];
$ @+ x3 y( \8 B& ~fip=fopen('C:\binary4.bin','wb');
# p# N5 l! i7 g; J) Q% `9 Y+ pfwrite(fip,y,'double');$ r1 c  h  {, I( c4 G
fclose(fip); %返回指针的值为0,则表示存储数据正常
& D; L8 G9 E8 f2 q0 N" Y  j' l- f7 }
%从数据文件读取二维数据# ^7 B2 y3 D5 i2 u  D
fip=fopen('C:\binary4.bin','rb');
: B" t: D  l1 ~* B# m2 M[Array_2D,num]=fread(fip,inf,'double');%inf表示读取文件中的所有数据,[M,N]表示
+ U1 u, e9 D$ y3 V%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
6 S& o/ j' R9 m- _$ w$ ~fclose(fip)+ {- K6 x! ]$ T' I$ }
# U7 o2 k3 D4 R: d0 ?- t# f
详细的范例如下。# V! q0 J0 h% N4 Z

6 C9 x, q# z5 M7 W8 d**************************************************************************************- N0 o; X3 r* b) G4 m, z: B

& ]2 r; s; i9 x& L6 k8 L2 X0 }%写一维数据至数据文件! f8 p5 `$ M2 i
n=0:pi/10:4*pi;
7 G4 n0 j" E( X& oy=sin(n);
  \6 x! Q4 A# e/ A1 m$ v' Yfip=fopen('C:\binary3.bin','wb');
% m/ Q3 J1 z6 S" V8 l% Gfwrite(fip,Pxx,'double');- D+ g' K) W& I9 f8 E3 K
fclose(fip);+ l8 q7 g7 N6 g+ [4 H1 ?1 o/ L
! f# O5 V; [! q% A0 \8 ]  Y7 Q" {
%从数据文件读取一维数据
, ^, A$ h. s' q& Ffip=fopen('C:\binary3.bin','rb');
4 e. p# E' k! [. }; Z3 @7 ]0 S[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示
4 e9 F7 E; h( A/ e$ y5 H0 r6 D将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中7 d# l$ u6 ?' [6 I0 C  S; g
fclose(fip)
/ W/ v' u3 q1 t$ P2 Q5 w: e9 a& G
7 P2 M& d6 K* J, }1 Y7 m  a%写二维数据至数据文件
: e9 c5 c0 e+ W1 t, q4 dn=0:pi/10:4*pi;. P( u  o; x. i" Q8 O3 U+ l
y1=sin(n);y2=sin(n);y3=0.5*sin(n);2 u+ ?6 V& P9 @2 \2 {% n
y=[y1;y2;y3];' {' L  s8 E' m/ h
fip=fopen('C:\binary4.bin','wb');
4 k+ w; F1 X) I7 X. y4 p, Vfwrite(fip,y,'double');
* X% l: M1 t3 X4 h9 Mfclose(fip); %返回指针的值为0,则表示存储数据正常: [8 R* _( q9 [% _
7 H- C- f. ?* G- D6 c/ l/ {
%从数据文件读取二维数据+ S/ v8 Z( H. j; t
fip=fopen('C:\binary4.bin','rb');4 Z9 F3 G0 g' X1 o$ H+ W7 C
[Array_2D,num]=fread(fip,[3,41],'double');%inf表示读取文件中的所有数据,[M,N]表示( \1 ~/ V- {) c' J* H
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
8 G; ~' l$ f3 C/ l) f) ?fclose(fip)
, r' y2 Z1 [6 A0 W+ v' |1 O% [- z( g' f# y
1 A6 L" d6 B4 h. B- P) k3 g2 @

( W5 I6 \) b2 a' F

该用户从未签到

2#
发表于 2020-3-19 18:20 | 只看该作者
看看如何在Matlab中读取和写入二进制数据。
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2020-3-20 18:10 | 只看该作者
    在Matlab中读取和写入二进制数据
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-2 09:54 , Processed in 0.140625 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表