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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1 r  y, k! J8 a7 l9 B
Matlab中关于二进制数据文件操作所使用的语言是标准的C,有关数据文件的编程方法与LabVIEW类似。6 M# Z5 r. Z: K$ Z* P2 I
! T& S9 j' P8 f/ Y) _
1、文件的打开与关闭! }: H8 Y  o! K8 X1 K0 k
1)打开文件
, n$ c  D8 V* ^5 m在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:% w$ L6 B4 M, g
fid=fopen(文件名,‘打开方式’)- b" S0 p) w" M3 w  p( I  g
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:2 G4 A! u+ E  D6 R5 ^( w$ b
‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
1 o2 |7 j3 H# c2 D5 j& J5 L ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。5 v2 T) w) d- N
‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。8 P, f+ i: e% ^5 H7 t
‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
0 v/ H/ S7 @6 A) @ ‘a’:在打开的文件末端添加数据。文件不存在则创建。
6 Y/ W$ }! t/ ^2 V& z4 d* j# e' U ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。  S0 z3 v' V4 H2 o1 F) F
另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。# f+ C. ]' F& W& O) X3 D# y
2)关闭文件
: Z! S+ ^% ^  \5 }文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:$ b, t* P# ?! H
sta=fclose(fid)$ O& c1 `0 z! I5 K8 w; t
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
6 t4 ~. S& u2 P7 P2、二进制文件的读写操作
5 H2 B. o; G% m; F5 T1)写二进制文件0 m+ N6 v& q9 r1 w7 e
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:
" _% J! T2 x9 _( _2 {! ^COUNT=fwrite(fid,A,precision)
6 y2 n0 H8 d2 D4 C/ N0 |说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。( S" X  k/ K' \/ r. V
例6.8 将一个二进制矩阵存入磁盘文件中。0 n9 G2 u" q1 o& p  _: r
>> a=[1 2 3 4 5 6 7 8 9];5 i+ e+ X/ S0 v! r3 [
>> fid=fopen('d:\test.bin','wb')   %以二进制数据写入方式打开文件. L% _9 h0 ?" J; B
fid =
* z* q/ r  f! {+ ^  3           %其值大于0,表示打开成功
) e' l; N9 _0 K% t" r9 N>> fwrite(fid,a,'double')# S! `3 H+ \5 x1 O# S7 h. i2 W4 y* c
ans =
+ _" |. ]& d* c3 {  9           %表示写入了9个数据0 B; u5 @0 A8 I" y
>> fclose(fid)! c' R2 H# |3 k* b# B/ H1 u$ E
ans =        + z( W( S3 P2 w7 j! L) A3 v# h; `
  0           %表示关闭成功9 X# o2 N, q  c+ Y  e/ H& F3 B
2)读二进制文件& }: k5 p# r1 R) M3 ?2 j" V
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
+ @5 f% E- V3 H- y9 h5 v& b[A,COUNT]=fread(fid,size,precision), p* @/ y, }5 y4 ]) c
说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
/ T' Z1 S2 K. U: M& {
5 _9 {4 U& `3 f9 y# S%写一维数据至数据文件
4 c" i0 c4 H# g% D4 f* f; ^! vn=0:pi/10:4*pi;4 s- B% V( j% \
y=sin(n);' S# `  z; g" l
fip=fopen('C:\binary3.bin','wb');) z: t* x& i- q1 M
fwrite(fip,Pxx,'double');
5 h" ~* z' i$ }0 T# u9 X" X+ gfclose(fip);
$ y* m/ f3 b* }0 q* t& H7 {( r
: i5 s1 J8 y: r6 _* ^! e%从数据文件读取一维数据0 ?- M% I+ d! k. c# D' |
fip=fopen('C:\binary3.bin','rb');% }) _+ v* a3 B& u9 S( `  y
[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示+ [, u- r- R/ j5 e, D7 P8 l* B0 p
%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
& y# t6 T8 E4 lfclose(fip)% F& h# K& b) O9 G; t5 ^

! [) B$ D1 J7 U2 g%写二维数据至数据文件
7 t) B* A6 T" o  qn=0:pi/10:4*pi;( |" n2 K, m/ q: b
y1=sin(n);y2=sin(n);y3=0.5*sin(n);
) k0 b8 T* G: E& D8 U; {- }: O  oy=[y1;y2;y3];
( m6 V1 _0 K4 u0 g* O" b+ h4 Ifip=fopen('C:\binary4.bin','wb');1 f9 a  v0 d, K% a4 T: n
fwrite(fip,y,'double');
4 u+ x# }/ b, V9 c, [& sfclose(fip); %返回指针的值为0,则表示存储数据正常
( r# `8 H9 b) e% N6 a# h/ [( z9 U! `8 \5 Q& ~1 q5 Y6 j5 B
%从数据文件读取二维数据
# p* `; ^* G# K. l5 Hfip=fopen('C:\binary4.bin','rb');
' U/ ^2 `+ j+ Z6 l0 S( n[Array_2D,num]=fread(fip,inf,'double');%inf表示读取文件中的所有数据,[M,N]表示
* p6 b; r; Y1 Q- D6 {1 b# M9 q! s) R%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中# |1 C( D% c/ x( A, d  \$ R9 ]
fclose(fip)
5 k$ h1 F! R- {& s  Q4 o( Y- L3 p, q9 G2 G8 I/ A7 T. Q
详细的范例如下。3 p. u$ G1 l$ ~; r6 q4 y% Z3 Y6 [
: n/ E/ V( D  w: Y, M. k
**************************************************************************************
5 B: d" p: o% q2 k" C/ o" B  Q1 L/ d$ X, H% y& X1 J2 f# J
%写一维数据至数据文件( X0 H. f( {& Y% Z+ H) D6 U
n=0:pi/10:4*pi;
% C8 b7 i7 l. _y=sin(n);
  e) U2 N( T7 g* F1 R7 q) [; {1 ufip=fopen('C:\binary3.bin','wb');/ O7 o/ i% @- l' o6 e
fwrite(fip,Pxx,'double');
4 S# \2 D5 Z% N' q) r: c  ofclose(fip);
) V- y0 [7 F, @) `8 v
$ N( R$ l2 J, U%从数据文件读取一维数据
6 J0 x) o+ M) F% W7 R! p+ l8 b9 ~fip=fopen('C:\binary3.bin','rb');
1 a$ V5 g$ A$ M' m; x% S[SIN,num]=fread(fip,[2,20],'double');%inf表示读取文件中的所有数据,[M,N]表示: `, V# I7 L: G- }  W/ M4 j
将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中( N+ v* Z7 _2 U/ x& w) e: x
fclose(fip)3 D2 Y* m9 s& R+ |1 e

& w' ]$ v7 ?. {6 W% P  v9 ]3 R%写二维数据至数据文件
/ c) w6 V9 g2 f: l" l% W0 N$ ]* vn=0:pi/10:4*pi;9 D- t. h0 `- F8 Y/ E
y1=sin(n);y2=sin(n);y3=0.5*sin(n);$ Q5 e8 H. y0 r( ^. q8 R
y=[y1;y2;y3];" g* [( w) b5 s, L
fip=fopen('C:\binary4.bin','wb');
% B1 ]3 l( O9 k: ]& k# n/ ^0 `$ \fwrite(fip,y,'double');
& a/ t+ m% Z  I$ s. ofclose(fip); %返回指针的值为0,则表示存储数据正常% h* I, D5 z; C
+ G3 D. M! r# {& m2 \
%从数据文件读取二维数据! s3 ?9 n; l" P; J! i4 ]  D2 D
fip=fopen('C:\binary4.bin','rb');0 g' r& D* A1 b! p( C
[Array_2D,num]=fread(fip,[3,41],'double');%inf表示读取文件中的所有数据,[M,N]表示
( `+ h3 |3 X8 H8 i%将读取的数据放置在M行N列中,N表示将读取的数据放置在1列中
$ j9 A1 N: ^. Xfclose(fip)6 v" I! ]4 k! L) ?; n, s
  q, `6 i: y. f- C/ ~- W
( D4 B$ D4 B$ d) E. V

( `3 c, Q6 o/ B5 R

该用户从未签到

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-4 18:04 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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