EDA365电子论坛网

标题: 怎样在Matlab中读取和写入二进制数据 [打印本页]

作者: thinkfunny    时间: 2020-3-19 10:11
标题: 怎样在Matlab中读取和写入二进制数据
/ m, Y. E0 B, U2 K1 p0 g! L
Matlab中关于二进制数据文件操作所使用的语言是标准的C,有关数据文件的编程方法与LabVIEW类似。. b" k; V; N: j' `% B

7 n4 w: }3 l; l3 X1、文件的打开与关闭
# C) u' D  @& l  F3 y1)打开文件
5 c3 J% M2 H7 h) X在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:5 ~1 H7 T) o" o# w2 k  E/ o+ [
fid=fopen(文件名,‘打开方式’)) Q% G1 R. Y6 Q5 }
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
! R' T$ P/ e) S2 G ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。5 v# A+ @0 \/ C. S
‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
( T8 w# |4 m; b/ u0 D ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
3 q: R6 T; S  H/ G ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。. C8 G4 H/ a2 }/ K# u0 p
‘a’:在打开的文件末端添加数据。文件不存在则创建。2 |, s! D* u5 I: d0 B3 R2 C
‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
% h! \/ u) |" x; k另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。# T+ G( A6 D" F4 Y, F- E
2)关闭文件6 M6 D1 {+ B  U  J; R
文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:
6 {  t) M# k% Zsta=fclose(fid)' e* N6 {. y7 U" M- ?) ?- T
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
4 t( Y6 u3 t, y: @2、二进制文件的读写操作
0 V; }! k, r6 }3 y3 Q1)写二进制文件2 }" f$ w2 Y9 W- `# E- F& a
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:
% M/ y) z" A" D7 _. w$ j" e- qCOUNT=fwrite(fid,A,precision)
  S0 m( K' D: a/ v7 E' s- D  C2 w说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。
, ~4 X1 H. b) y% |2 Q$ W例6.8 将一个二进制矩阵存入磁盘文件中。  D& w& N# C; H  `6 f; n- |  o' F5 L
>> a=[1 2 3 4 5 6 7 8 9];' W9 L9 ?1 p) y: N/ `3 w9 w) F
>> fid=fopen('d:\test.bin','wb')   %以二进制数据写入方式打开文件( ^- H4 Z# m$ Q/ l
fid =* m! q4 N  q- |
  3           %其值大于0,表示打开成功
7 C$ R" w3 z3 M% L* {+ o>> fwrite(fid,a,'double')
9 y+ h6 U+ G/ z, K, W* X' w& oans =8 H( d& L% j4 ]+ a
  9           %表示写入了9个数据4 f% o; @: I0 a  ^
>> fclose(fid)5 ~! x* @9 v' V9 A
ans =        0 Y' b- C9 ~' J/ B! N
  0           %表示关闭成功
  t- z9 w7 G) G5 d* `1 ]' F2)读二进制文件; z' ]6 j' _+ R1 ?9 I
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
  k3 E" a0 n3 y4 E( Z[A,COUNT]=fread(fid,size,precision)
/ g6 V" @+ v  ?+ a9 g7 l说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
2 f6 b+ w' W* o( L7 a- Q0 P7 X  o; S# |7 a
%写一维数据至数据文件
+ Y, H% i7 l  ^5 V9 v1 Sn=0:pi/10:4*pi;' S$ D7 f, I  Q$ L
y=sin(n);% q7 l& I, Q+ L8 M
fip=fopen('C:\binary3.bin','wb');
8 e) ^8 u7 r9 t& Y5 cfwrite(fip,Pxx,'double');
- \' @7 |0 n( E3 w2 J" i& _fclose(fip);
8 j/ u+ h- e2 V, K& i" c! J
" }+ |; D; c3 x. m%从数据文件读取一维数据/ K% k4 A' G% a
fip=fopen('C:\binary3.bin','rb');
% L4 l  o: i$ I& g+ y/ u7 W6 ~[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示
+ @, K. A; h# ~%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
# `4 t# |! _) Z4 pfclose(fip)
& x8 \, a! ]5 o1 E/ Y
6 b! {7 a. F! u* [" Q! U%写二维数据至数据文件
2 a  b( |* q- Q1 T3 T" Jn=0:pi/10:4*pi;$ [* j$ o  b# n7 {3 W* T
y1=sin(n);y2=sin(n);y3=0.5*sin(n);
; D8 n( v) W; @) Ky=[y1;y2;y3];
2 C5 g& w; I( Y: {3 \5 A3 yfip=fopen('C:\binary4.bin','wb');
0 ]: L( ]& Q7 D! M( Q3 Tfwrite(fip,y,'double');: u9 F- x: v' [# b. d) K
fclose(fip); %返回指针的值为0,则表示存储数据正常6 d/ H5 w4 t; J1 t5 ]# Q

, x$ r' X" w. O: f: |; x%从数据文件读取二维数据% V" M: Q8 Y5 l
fip=fopen('C:\binary4.bin','rb');
  _& \! r/ J6 C/ z2 e1 S[Array_2D,num]=fread(fip,inf,'double');%inf表示读取文件中的所有数据,[M,N]表示) ]; L& E6 o2 Q* E% [/ q0 E
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
2 M* M6 D. H+ {: O+ g4 k5 Mfclose(fip)! @" L0 ]1 r3 G  i5 @) |
# g8 Q4 y0 m& u2 D
详细的范例如下。
' j( m* I% T5 {% v0 q; I2 s7 y, Y* e9 I
**************************************************************************************! K1 d$ D: u  x6 g$ H
9 h! \1 _$ n+ Y& E1 j, s
%写一维数据至数据文件
9 S, d0 d2 s  I& ?8 l+ an=0:pi/10:4*pi;
! v& K, s" a2 R6 D2 @: }( ny=sin(n);! G9 o! G4 Q, }# y4 l7 W/ @: s
fip=fopen('C:\binary3.bin','wb');
3 C" ^5 R% U3 X# q) Qfwrite(fip,Pxx,'double');) k' z' K# i+ a
fclose(fip);9 V; i2 t; p9 H

% }8 K& U* k( `. U+ q%从数据文件读取一维数据. J% k  F9 f5 a5 M
fip=fopen('C:\binary3.bin','rb');
, y" ?0 u. _3 L0 V+ H# b- |$ K[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示
( y" G. v3 D- h将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中; W9 E2 r& J1 d) U6 Z+ A
fclose(fip)  G! c+ d; A% `" h

6 ~, s, v- r. j%写二维数据至数据文件
6 r2 Z' s1 o; X3 p7 O1 z% @3 J& fn=0:pi/10:4*pi;
$ V' W! A3 _( s, o  o: c. y2 L. xy1=sin(n);y2=sin(n);y3=0.5*sin(n);8 m/ U" p, q( y$ ~2 T
y=[y1;y2;y3];
, h1 W- ?) `- Kfip=fopen('C:\binary4.bin','wb');2 G6 W6 M$ L, s, K  s
fwrite(fip,y,'double');
/ _0 P/ r# J' O( ]  mfclose(fip); %返回指针的值为0,则表示存储数据正常) k( L& |  v) Q$ A7 I; ]
' \9 C% f9 X8 A4 E$ `
%从数据文件读取二维数据5 f" F, A6 H  a) W3 A
fip=fopen('C:\binary4.bin','rb');$ ?$ V3 r0 i: u0 X/ E2 H
[Array_2D,num]=fread(fip,[3,41],'double');%inf表示读取文件中的所有数据,[M,N]表示$ m8 e5 b: G4 K
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
6 C: @& J* \5 tfclose(fip)
) ]$ o! C+ U6 M& N3 {
3 B* s$ r8 m5 k) ^0 z% C5 T; s# m- U; H+ y# y4 ?

: Y) n/ c  q! U3 n
作者: gaoxings    时间: 2020-3-19 18:20
看看如何在Matlab中读取和写入二进制数据。
作者: yin123    时间: 2020-3-20 18:10
在Matlab中读取和写入二进制数据




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2