matlab写文件头,matlab 文件读写笔记

matlab文件读写

1. textread

最常用的方式 [A,B,C,...] = textread('filename','format')

这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果

如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件

[A,B,C,...] = textread('filename','format',N)

文件mydata.dat是

Sally    Type1 12.34 45 Yes

[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)

该函数还支持更加结构化参数化的读取方式

[...] = textread(...,'param','value',...)

其中value 一一对应于param

文件data.csv是

1,2,3,4,,6

7,8,9,,11,12

用NaN填充空单元:

data = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);

ile  = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');

注意,正如该函数的名字所指出的,他只能读取文本文件,

这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止

这个函数的优点在于不用先fopen,也省了fclose了。

详情参见 matlab help

2. fscanf

A = fscanf(fid, format)

[A,count] = fscanf(fid, format, size)

无size域时或者size=inf时,读出整个文件

注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量

如果只有部分格式符合,则只有符合的部分被读出,然后停止

注意 %i 格式  Defaults to base 10 integers. Data starting with 0 is read as base 8.

Data starting with 0x or 0X is read as base 16.

当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。

注意,当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.

尚未用过

3. fread

A = fread(fid)

A = fread(fid, count)

A = fread(fid, count, precision)

A = fread(fid, count, precision, skip)

A = fread(fid, count, precision, skip, machineformat)

读取二进制文件

不指定count,则读到文件结尾

不指定format,默认uint8

默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式

内建pointer会记录当前读取位置,以备下次从该位置开始继续读取

还有skip 若干比特的功能,尚未用过

4. fprintf

count = fprintf(fid, format, A, ...)

如果没有指定fid,则可以用来屏幕显示字符串

注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据

如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印

for m=1:length(A)

fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;

end

%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。

%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果

1288789070_bb699e3e.jpg

测试方法如下:

fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));

所以要看数据的范围,选择合适的打印方式

不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。

而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况

if abs(x)< 2^31

fprintf(fid,'%d', x);

elseif  x >= 2^31

fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));

elseif x <= -2^31

fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));

end

fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失

format long g 以非二进制方式显示,而且不受小于32位的限制

5. textscan

6. fgetl ftell

7. fwrite

注意常用的文件格式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值