Matlab学习笔记(9.2)MATLAB文件操作
1.文件打开与关闭
① fopen函数
用于打开文件,其调用格式为:
fid=fopen(filename,permission)
其中,fid为文件识别号,打开文件成功时,fid返回一整数,用来标识该文件;打开文件不成功时,fid值为-1。filename为待操作的文件名,permission为对文件的允许使用方式。
文件的使用方式:
'r' | 以读方式打开一个文件 |
'w' | 以写方式打开一个文件 |
'a' | 在该文件尾添加数据 |
'r+' | 以读和写方式打开一个文件 |
② fclose函数
用于关闭已打开的文件,其调用格式为:
status=fclose(fid)
fid是要关闭文件的标识号。如果fid为all,则关闭所有已打开的文件,但标准文件除外,即屏幕、键盘。返回0表示关闭成功,返回-1则表示关闭不成功。
2.文本文件的读写
fscanf函数和fprintf函数
fscanf函数用于读取文本文件的内容,fprintf函数用于将数据写入文本文件中。调用格式为:
[A,count]=fscanf(fid,fmt,size)
count=fprintf(fid,fmt,A)
其中,A用于存放读写的数据,count返回成功读写的数据元素个数;参数fid为文件标识号,fmt用以控制读取的数据格式,size用于指定A的大小。
- fmt由%加上格式符组成,在%之后还可以加上数据宽度,如%3d,%10.3f
- 常见的数值格式控制符如下:
'%d' | 整数 |
'%f' | 小数形式的实数 |
'%e' | 科学计数法形式的实数 |
'%c' | 字符 |
'%s' | 字符串 |
- size可取值:
n | 指定读取n个数据 |
Inf | 指定读取文件中的所有数据 |
[m,n] | 指定读取m×n个数据,数据按列顺序存放到矩阵A |
e.g. 文件“观测记录.txt”的内容如图所示,读取文件前10行的数据。
fid=fopen('观测记录.txt','r');
title=fscanf(fid,'%s',6);
qxsj=[];
for i=1:10
qxsj{i,1}=fscanf(fid,'%s',1);
qxsj{i,2}=fscanf(fid,'%s',1);
qxsj{i,3}=fscanf(fid,'%f',1);
qxsj{i,4}=fscanf(fid,'%f',1);
qxsj{i,5}=fscanf(fid,'%f',1);
qxsj{i,6}=fscanf(fid,'%s',1);
fclose(fid);
3. 二进制文件的读写
fread函数和fwrite函数
fread函数用于读取二进制文件,fwrite 函数将数据写入文件。这是函数的调用格式。
[A,count]=fread(fid,size,precision,skip)
count=fwrite(fid,A,precision)
其中,A用于存放读写的数据,count返回读写成功的数据个数。fid为文件识别号,precision指定读写数据的类型,size用于指定A的大小,skip指定按比例周期性地跳过一些数据。
e.g. 计算y=exsinx,其中x∈[0,2π ]。将x、y写入二进制文件“模拟数据.dat”。
fid=fopen('模拟数据.dat','w');
x=linspace(0,2*pi,100);
y=exp(x).*sin(x);
count=fwrite(fid, [x; y], 'double');
fclose(fid);
4.数据文件定位
① fseek函数
该函数用于 改变 文件位置指针的位置,其调用格式为:
fseek(fid, offset, origin)
其中参数fid为文件识别号,offset表示位置指针相对移动的字节数(可取负值);origin表示位置指针移动的参照位置。 定位成功返回0,否则-1。
origin的可取值:
'cof '或0 | 文件指针的当前位置 |
'bof '或-1 | 文件的开始位置 |
'eof'或1 | 文件的结束位置 |
fseek(fid,0,-1) %指针移动到文件头
fseek(fid,-5,'eof') %指针移动文件倒数第5个字节
② ftell函数
用于 查询 文件指针的当前位置,其调用格式为:
position=ftell(fid)
返回值为从文件头到指针当前位置的字节数。若返回值为-1,表示获取文件当前位置失败。
③ feof函数
用于判断当前的文件位置指针 是否到达文件尾部 :
status=feof(fid)
当到达文件结束位置时,返回值为1,否则为0。
e.g. 读取生成的'模拟数据.dat'文件中的后40组数据,并绘制图形。
fid=fopen('模拟数据.dat','r');
status=fseek(fid, -40*2*8, 'eof');
x=[]; y=[];