EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
matlab文件读写 1. textread 7 U+ G8 S# u# G7 W' v
最常用的方式 [A,B,C,...] = textread('filename','format')" n+ ? D$ ^( b8 ~
这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果 如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件- R, d0 [. T( N' N! u
[A,B,C,...] = textread('filename','format',N)
4 i z2 u7 r. G9 V: d! `; b文件mydata.dat是
% _& D% Z. Z* Q& I! \Sally Type1 12.34 45 Yes( K! m+ F+ U/ x* q @
[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1) 该函数还支持更加结构化参数化的读取方式- ]5 a6 [: Q9 E5 i
[...] = textread(...,'param','value',...) 2 d5 }9 X, e, a
其中value 一一对应于param
; d% t) U9 I! P6 g2 f. C文件data.csv是9 p# E# U& C: Q
1,2,3,4,,6; l4 A t+ @2 E3 S y
7,8,9,,11,12
1 |3 V! k8 z/ F3 _) e* {. X8 ?用NaN填充空单元:
" D* O. y7 H0 {3 Jdata = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
% x4 y' v: K$ w, ?ile = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', ''); 注意,正如该函数的名字所指出的,他只能读取文本文件,( y' L$ H4 P/ v! N+ S
这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
# h0 Z# r7 V/ \: k这个函数的优点在于不用先fopen,也省了fclose了。
& l7 A2 Y1 S- P详情参见 matlab help 2. fscanf
9 H, z& Q# V6 C2 e DA = fscanf(fid, format)
9 k7 c) }% g3 P5 Q7 ?8 o[A,count] = fscanf(fid, format, size)1 j+ I% C! m% C6 r# u1 @2 ]
无size域时或者size=inf时,读出整个文件 注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量 ! f1 _( K, F" j
如果只有部分格式符合,则只有符合的部分被读出,然后停止( e1 a+ T f! o! I% b
注意 %i 格式 Defaults to base 10 integers. Data starting with 0 is read as base 8.
/ J7 d& D$ C9 q; H5 W Data starting with 0x or 0X is read as base 16.- d- J4 u% K' m' C& `, R
当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。! B3 _5 F, E, Z+ y; J
注意,当size = [m,n]时,表示要读取m*n个数,但是并不是直接把数据组织成m行,n列,而是依次一行一行的读,然后一列一列地写,得到的是n 行m列的结果,需要转置一下。 An asterisk (*) Skip over the matched value. If %*d, then the value that matches d is ignored and is not stored.
$ Q0 X2 C# g, w5 |3 Q尚未用过
" Y: E! v% c# s7 _3 {* i7 b/ _; P3. fread. D: Q9 t7 }* @
A = fread(fid)
" Z$ b) ?( F+ _% @7 U, cA = fread(fid, count)
& r6 y+ r7 T* x* p* ?A = fread(fid, count, precision)
@! o- [8 K) {, uA = fread(fid, count, precision, skip)
- G+ _8 r2 @# _7 W* _A = fread(fid, count, precision, skip, machineformat)! \. h1 A4 G# p/ u( B
读取二进制文件! O/ t" ? E- h3 W8 m- H0 v8 X
不指定count,则读到文件结尾
) i2 p& k) c8 j7 [; q% \; f" E不指定format,默认uint8
5 K' ]7 \* {( `默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式+ t8 \* ]: }; b6 R
内建pointer会记录当前读取位置,以备下次从该位置开始继续读取$ [- p& }. |# y
还有skip 若干比特的功能,尚未用过
4. fprintf
$ m3 {- L# A# ~) f4 c: M. ]3 acount = fprintf(fid, format, A, ...) 如果没有指定fid,则可以用来屏幕显示字符串
; X4 s0 i$ |8 h$ N注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
! O' ?* }. V; Z! o% J& K9 |- `如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印
% U; l7 b$ S7 m8 F0 y: V8 s3 t3 Ffor m=1:length(A)
, A( R/ L# b( w7 w6 [: ? fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ; J8 E4 @1 R6 U1 {
end %d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。
4 y" v; m0 |. W! {%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果 测试方法如下: fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1)); 所以要看数据的范围,选择合适的打印方式 不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。
1 j J. X7 c2 \- \4 z0 c( N而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况 if abs(x)< 2^31
9 g& a3 v4 x3 k, g1 Z6 o fprintf(fid,'%d', x);5 _3 ]4 o' C2 D0 Y. |5 Y" j/ U8 ^2 K
elseif x >= 2^31
" _$ E [: X' l; ?8 d: W# L: a fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));. Y2 {1 g J# N7 B
elseif x <= -2^312 y9 d* t8 X% i/ {6 ^2 ?2 w
fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
& }+ |! f2 u) L: l- U& a5 Y1 d end
) O! Z5 e3 E$ s. o6 S, U, kfopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制 5. textscan
, A1 x, H- y# T: X" J s6. fgetl ftell 7. fwrite ( e7 u/ @' v6 |
4 @! f/ \( p+ P: h. ` |