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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
4 m, c3 \0 Y( o8 ^/ H+ V* T
Matlab中关于二进制数据文件操作所使用的语言是标准的C,有关数据文件的编程方法与LabVIEW类似。
8 O* c  r  S% b, F/ e6 N! r. ?. I3 R- _* M& X9 B+ k
1、文件的打开与关闭
1 A, y2 a- b2 {1)打开文件
' o/ U- t' @, L* N7 N" Z/ y在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:
' N" T4 T' k' {2 I! Z6 V, X1 \fid=fopen(文件名,‘打开方式’)
% c1 v( Q0 T! V! T3 v% N说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:' t! L  E5 p( t& I; {6 l* f
‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
  @2 \) w! J* @7 {2 W ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
8 W% L/ a+ M: Q5 r ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。# M+ s; U' e, L% F& W
‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。5 \- t! T. X8 L
‘a’:在打开的文件末端添加数据。文件不存在则创建。
! g& T% t; f2 D* S$ q: a6 d ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
! U- T$ @: l! ^+ O* x' s另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。1 N) X, v& L" m4 G( E
2)关闭文件
$ y9 Q6 v/ R! w- T文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:* q  o# H. X  e: I- B# \
sta=fclose(fid)
; ]5 L( G* D' m( Z7 d7 c5 Z5 m' P说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
7 u0 S& ^( m" a% r8 X2、二进制文件的读写操作
' v* P0 X2 J' q2 h1)写二进制文件
: Z5 E$ ~2 {9 t0 l$ O2 k3 A3 _fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:( N, n- u7 s$ [* @( V
COUNT=fwrite(fid,A,precision)5 ^% {* k3 g& v2 M0 k) a% W& _
说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。
3 Y+ Y) }1 S+ V$ L5 a例6.8 将一个二进制矩阵存入磁盘文件中。0 N- k! {' b( B- |" ~
>> a=[1 2 3 4 5 6 7 8 9];3 ~) n& Z/ u- a3 [: I, C+ O3 h9 |& [
>> fid=fopen('d:\test.bin','wb')   %以二进制数据写入方式打开文件4 \# k4 }9 M$ H; |
fid =
  [( Z. H& L9 B- c1 c; m  3           %其值大于0,表示打开成功) M# ^0 [$ k  z
>> fwrite(fid,a,'double')
( j# Y; [4 e- \2 F0 v. j- \ans =1 n1 f+ ]( H/ D6 l" K. j% Z
  9           %表示写入了9个数据
( w: j% g0 A1 p% v+ h# \>> fclose(fid)
1 n& O' c+ j* \; _7 E- zans =        
  O0 @% c/ O5 t& s( o  0           %表示关闭成功
* j( U! B1 }' [2)读二进制文件- |- y1 m+ o( e+ r$ Z8 ~
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:9 ?4 n; f* _2 n& {$ o5 ]0 L
[A,COUNT]=fread(fid,size,precision)
1 }0 s% `! J$ ~* y; {7 W说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
) G9 [: _5 T8 y' e& I6 e3 k2 O& Q# V, v& w& _& J0 W8 J
%写一维数据至数据文件
- x; E- M) d' `$ B  w8 t2 G! }n=0:pi/10:4*pi;
, j" x4 `4 u' ~6 Z$ i8 Uy=sin(n);% \2 k, P% V. f& x+ j* N
fip=fopen('C:\binary3.bin','wb');- {; h! B) q9 b7 @9 W
fwrite(fip,Pxx,'double');
: g. p2 z7 V4 W8 vfclose(fip);
& u: D* P5 |# P1 M9 S
, H5 f& l. F2 s: K# m1 j1 w' w%从数据文件读取一维数据3 N5 t8 u/ t6 m" T5 P! B+ q4 L* b7 X
fip=fopen('C:\binary3.bin','rb');
' O# h" \0 ^8 W[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示" d% K0 c) m4 G/ s( R
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中) G9 A* y! A4 r# k
fclose(fip)1 M5 W. q8 c+ f' y2 K. h4 P
) d: k8 c8 _& r5 p. S; S1 a
%写二维数据至数据文件
9 z- `6 B5 J  Z2 K- H% F# gn=0:pi/10:4*pi;( ?  ?% H/ l( O% b% O
y1=sin(n);y2=sin(n);y3=0.5*sin(n);
+ O3 A5 E9 V, U2 e1 F8 wy=[y1;y2;y3];
% r. \1 e+ L$ E: u  U( _+ Tfip=fopen('C:\binary4.bin','wb');
+ B* u. {. s( `4 L, u7 c. Zfwrite(fip,y,'double');& f" w) S- p( e
fclose(fip); %返回指针的值为0,则表示存储数据正常
/ V/ b9 Z5 g5 F* M( b* K6 H, _+ _  ?$ _) q
%从数据文件读取二维数据# j9 A% V- v  j& \/ ]0 i
fip=fopen('C:\binary4.bin','rb');
3 ^( @7 M( a1 {[Array_2D,num]=fread(fip,inf,'double');%inf表示读取文件中的所有数据,[M,N]表示% K+ E* B: l! ~$ e" v
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中- }( k! W+ [! p0 j& I. H
fclose(fip)
, Z7 j9 o; }5 n7 ?1 R( R  g
* U% G$ d. P: s  J详细的范例如下。
7 z# k- [4 k: L, N. [* U$ r9 R& g6 {. b3 n! {( V2 L$ t
**************************************************************************************
* e' \5 B7 [* m7 w0 Y3 k* c+ ~* s+ Y) J
%写一维数据至数据文件( j+ k4 `, u* p
n=0:pi/10:4*pi;
+ F! k/ z0 }. T) Z* }. r& By=sin(n);0 C2 C: z# k* A! p5 W
fip=fopen('C:\binary3.bin','wb');
1 Y: U+ Z1 ?9 F" k" y5 Yfwrite(fip,Pxx,'double');9 F5 q& _; r* G# _4 N; ]2 W# b
fclose(fip);
; Q1 A. M7 Q6 T+ B: S$ s& z
% C5 L/ X+ [2 d! ?& K: H/ {; h: G%从数据文件读取一维数据6 W1 @( J1 t2 X. Z
fip=fopen('C:\binary3.bin','rb');
; n1 h' S) |/ I/ t6 r[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示
7 D: e! {; n2 `6 M5 P# R& O# u2 m将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
% ?4 r# E- q7 @. L' s! |7 Wfclose(fip)
) H& }/ d& T3 q* d; i
& H+ A3 z8 D  @" Z2 g5 h%写二维数据至数据文件; {0 V9 B0 L$ y; `! u# b! ^
n=0:pi/10:4*pi;+ r8 L' G6 }% v6 F! w
y1=sin(n);y2=sin(n);y3=0.5*sin(n);
3 U) j4 d# J$ |# o9 ]y=[y1;y2;y3];2 H( w. B$ M, w# [+ G2 ^: ]
fip=fopen('C:\binary4.bin','wb');  b! M2 y! m& B  ?' U  I
fwrite(fip,y,'double');8 F4 g9 [) g$ j, }+ h- h2 _' O% u
fclose(fip); %返回指针的值为0,则表示存储数据正常
1 c  J3 o; a; K3 C/ v% M6 Q: D$ p4 g0 o$ K; R5 y
%从数据文件读取二维数据
, o( C% [0 \& t# @# p+ ?fip=fopen('C:\binary4.bin','rb');; j4 e* Q1 Y6 n: s- |
[Array_2D,num]=fread(fip,[3,41],'double');%inf表示读取文件中的所有数据,[M,N]表示
- o$ r  p* U9 W: B) y%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
4 E' V, x$ M1 V/ M- Q0 Ffclose(fip)
9 I4 z( W/ X9 V6 C: I+ l& Y# Q
2 S2 }1 N. A2 i# r8 V5 C; j0 r& ]% K+ `1 c3 m; n  V# P

  _! ~; [( C, c) J

该用户从未签到

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-10-6 07:21 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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