MATLAB——文件读写(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB——⽂件读写(1)
1、⽂件打开关闭
(1)⽂件打开
fid=fopen(⽂件名,‘打开⽅式’)
说明:其中fid⽤于存储⽂件句柄值,如果返回的句柄值⼤于0,则说明⽂件打开成功。
⽂件名⽤字符串形式,表⽰待打开的数据⽂件。
常见的打开⽅式如下:
‘r’:只读⽅式打开⽂件(默认的⽅式),该⽂件必须已存在。
‘r+’:读写⽅式打开⽂件,打开后先读后写。
该⽂件必须已存在。
‘w’:打开后写⼊数据。
该⽂件已存在则更新;不存在则创建。
‘w+’:读写⽅式打开⽂件。
先读后写。
该⽂件已存在则更新;不存在则创建。
‘a’:在打开的⽂件末端添加数据。
⽂件不存在则创建。
‘a+’:打开⽂件后,先读⼊数据再添加数据。
⽂件不存在则创建。
另外,在这些字符串后添加⼀个“t”,如‘rt’或‘wt+’,则将该⽂件以⽂本⽅式打开;如果添加的是“b”,则以⼆进制格式打开,这也是fopen函数默认的打开⽅式。
(2)关闭⽂件
⽂件在进⾏完读、写等操作后,应及时关闭,以免数据丢失。
关闭⽂件⽤fclose函数,调⽤格式为:
sta=fclose(fid)
说明:该函数关闭fid所表⽰的⽂件。
sta表⽰关闭⽂件操作的返回代码,若关闭成功,返回0,否则返回-1。
如果要关闭所有已打开的⽂件⽤fclose(‘all’)。
2、⼆进制⽂件的读写操作
(1)写⼆进制⽂件
fwrite函数按照指定的数据精度将矩阵中的元素写⼊到⽂件中。
其调⽤格式为:
COUNT=fwrite(fid,A,precision)
说明:其中COUNT返回所写的数据元素个数(可缺省),fid为⽂件句柄,A⽤来存放写⼊⽂件的数据,precision代表数据精度,常⽤的数据精度
有:char、uchar、int、long、float、double等。
缺省数据精度为uchar,即⽆符号字符格式。
a=[123456789];
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','wb')%写⼊'w'
fwrite(fid,a,'double')
fclose(fid)
>> read
fid =
3 %⼤于0,说明⽂件创建成功
ans =
9 %写⼊9个数据
ans =
0 %等于0,说明关闭成功
乱码的⼆进制数
在ultra中显⽰如下,这是因为⼆进制表⽰位数太长,很⿇烦
(2)读⼆进制⽂件
fread函数可以读取⼆进制⽂件的数据,并将数据存⼊矩阵。
其调⽤格式为:
[A,COUNT]=fread(fid,size,precision)
说明:其中A是⽤于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为⽂件句柄、size为可选项,若不选⽤则读取整个⽂件内容;若选⽤则它的值可以是下列值:N(读取N个元素到⼀个列向量)、inf(读取整个⽂件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
precision⽤于控制所写数据的精度,其形式与fwrite函数相同。
clear all
a=[123456789];
fid=fopen('C:\Users\ning wang\Desktop\MATLAB\test.txt','rb')%读取'r'
[A,COUNT]=fread(fid,'double')
fclose(fid)
从⼆进制返回到double类型数组。
⼀定要注意读取的格式,否则返回的类型会发⽣变化
clear all
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','rb')
[A,count]=fread(fid)
fclose(fid)
将读写整合在⼀个程序⾥
clear all
a=[123456789];
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','wt')
fwrite(fid,a,'double')
fclose(fid)
fid1=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','rt')
[A,count]=fread(fid,'double')
s=A(1)+A(9)
3、⽂本⽂件的读写操作
(1)写⽂本⽂件
fprintf函数可以将数据按指定格式写⼊到⽂本⽂件中。
其调⽤格式为:
fprintf(fid,format,A)
说明:fid为⽂件句柄,指定要写⼊数据的⽂件,format⽤来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插⼊附加格式说明符,如数据宽度说明等,与fscanf函数相同,A是⽤来存放数据的矩阵。
clear all
a=[123456789];
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','w')
fprintf(fid,'%f',a)
fclose(fid)
控制精度
clear all
a=[123456789];
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test.txt','w')
fprintf(fid,'%.2f',a)
fclose(fid)
clear all
x = 0:.1:1;
A = [x; exp(x)];%矩阵
fileID = fopen('exp.txt','w'); %打开,写⼊
fprintf(fileID,'%6s %12s\n','x','exp(x)');%
fprintf(fileID,'%6.2f %12.8f\n',A);
fclose(fileID);
可以看到换⾏符,可以看到长度,可以看到⼩数位数,都是右对齐,按列取数,按⾏排列、可以看出记事本和ultra显⽰的差异clear all
x = 0:.1:1;
A = [x; exp(x)];%矩阵
fileID = fopen('exp.txt','w'); %打开,写⼊
fprintf(fileID,'%6s %12s\r\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\r\n',A);
fclose(fileID);
在记事本中,可以显⽰出换⾏
利⽤type ,查看⽂件内容
(2)读⽂本⽂件
fscanf函数可以读取⽂本⽂件的内容,并按指定格式存⼊矩阵。
其调⽤格式为:
[A,COUNT]=fscanf(fid,format,size)
说明:其中A⽤来存放读取的数据,COUNT返回所读取的数据元素个数,fid为⽂件句柄,format⽤来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插⼊附加格式说明符,如数据宽度说明等。
size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到⼀个列向量)、inf(读取整个⽂件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
clear all
fid=fopen('C:\Users\Administrator\Desktop\MATLAB\test1.txt')
data=fscanf(fid,'%d',[2,inf])
fclose(fid)
可以看出是2列n⾏。
clear all
x = 1:1:5;
y = [x;rand(1,5)];
fileID = fopen('nums2.txt','w');
fprintf(fileID,'%d %4.4f\n',y);
fclose(fileID);
type nums2.txt
fileID = fopen('nums2.txt','r');
formatSpec = '%d %f';
sizeA = [2 Inf];
A = fscanf(fileID,formatSpec,sizeA) fclose(fileID);
clear all
str = '78°C 72°C 64°C 66°C 49°C'; fileID = fopen('temperature.txt','w');
fprintf(fileID,'%s',str);
fclose(fileID);
fileID = fopen('temperature.txt','r'); degrees = char(176);%摄⽒度的符号[A,count] = fscanf(fileID,['%d' degrees 'C']) fclose(fileID);
跳过特殊符号
字符串和数字符号之间的转换。
4、⽇期的循环读取
(1)pause()函数
clear all
fileID = fopen('dateclc.txt','w'); %打开,写⼊while (1)
a=datestr(now,31)
fprintf(fileID,'%s\r\n',a);
pause(5)%每隔5秒写⼊⼀条⽇期
end
5、timer()函数
(1)timer定义
设置timer()属性,
TaskTimer=timer('Name','FebirdTimer','TimerFcn',@ExecuteTask,'ErrorFcn',@ExecuteError,'Period',1,'ExecutionMode','fixedrate');
其中 TimerFcn 为 Timer 执⾏的函数,后⾯的 ‘@ExcuteTask’ 就是你定义的函数名;同样 ErrorFcn 也是⼀样。
Period 为执⾏周期,ExecutionMode 为执⾏模式,fixedrate 为固定频率。
TimerFcn 的定义默认必须有两个参数:function ExcuteTask(obj,eventdata)。
其中 obj 为执⾏该函数所对应的 timer 对象,eventdata 为事件数据,⼀般⾥⾯为具体时间。
当需要在 ExcuteTask 中传⼊参数的时候,那么 Timer 可以这样定义:set(t,'TimerFcn',{@ExecuteTask,var1});那么这时函数定义应该
为: functionExcuteTask(obj,eventdata,var1)
ExecutionMode 执⾏的模式,就是确定TimerFcn执⾏周期计算的始末点
’singleShot’ :只能执⾏⼀次,故Period属性不起作⽤,其他模式都可以执⾏多次
‘fixedSpacing’ :上⼀次TimerFcn执⾏完毕时刻到下⼀次TimerFcn被加⼊队列时刻之间的间隔
‘fixedDelay’ :上⼀次开始执⾏到下⼀次被加⼊队列之间的间隔
‘fixedRate’ :前后两次被加⼊到执⾏语句队列时刻之间的间隔
TasksToExecute 执⾏次数:TimerFcn被执⾏的次数,默认为1次,设置多次时需要设置执⾏周期Period
StartDelay 启动时延:从启动Timer开始到第⼀次把TimerFcn的加⼊到Matlab的执⾏语句队列中去的时延, 默认值为0s
clear all
htimer=timer('TimerFcn','disp(''Hello World!'')', 'Period', 2,'executionmode','fixeddelay','TasksToExecute',5)
start(htimer)
创建⽇期txt⽂件,每两秒写⼊txt中⼀个⽇期,分别是主体程序,定义的函数和结束程序
clear all
global fileID htimer date1 time1 %全局变量
date=datestr(now,'yyyy-mm-dd') %⽇期,⽂件名
fileID=fopen([date'.txt'],'w')%创建txt⽂件
htimer=timer('TimerFcn',@date_my, 'Period', 2,'executionmode','fixeddelay') start(htimer)
function date_my(obj,event)
global fileID htimer date1 time1 %全局变量
date1=datestr(now,'yyyy-mm-dd')
time1=datestr(now,'HH:MM:SS')
[a,b]=weekday(now,'long')
fprintf(fileID,[date1 '' time1 '' b '\r\n'])
end
global fileID htimer date1 time1
stop(htimer) %暂停程序
fclose(fileID)%关闭txt⽂件
改进程序,加⼊表头
clear all
global fileID htimer date1 time1 %全局变量
date=datestr(now,30); %⽇期,⽂件名
fileID=fopen([date'.txt'],'w');%创建txt⽂件
%fprintf(fileID,[date1 '' time1 '' b '\r\n'])
fprintf(fileID,'%6s%6s%6s\r\n','⽇期','时间','星期');
htimer=timer('TimerFcn',@date_my, 'Period', 2,'executionmode','fixeddelay') start(htimer)
clear all
global fileID htimer date1 time1 %全局变量
date=datestr(now,30); %⽇期,⽂件名
fileID=fopen([date'.txt'],'w');%创建txt⽂件
fprintf(fileID,['⽇期''''时间''''星期''\r\n'])
%fprintf(fileID,'%6s%6s%6s\r\n','⽇期','时间','星期');
htimer=timer('TimerFcn',@date_my, 'Period', 2,'executionmode','fixeddelay') start(htimer)
以上是分别⽤规定长度和空格两种⽅式将表头输⼊,
利⽤timer画图动起来
clear all
t=timer('Name','CircleTimer','TimerFcn',@CircleTask,'Period',1,'ExecutionMode','fixedspacing');
%本句解释成中⽂就是:
%t= timer(计时器名字是啥?,叫CircleTimer,要输⼊的TimerFcn回调函数是啥?,
%⽤CircleTask这个函数,每次隔多久运⾏?,⼀秒,
%执⾏时间间隔的模式是什么?,上次执⾏完毕到这次执⾏计时);
ud=3;
erData=ud;
start(t);
function CircleTask(obj,event)
event_time = datestr(event.Data.time) %使⽤event对象的data的time属性获得系统当前时间,并转换成字符串d=event_time(19:20) %由于本⾝保存的是年⽉⽇⼩时分钟秒,但我只需要秒的数据,因此单独取出
d=str2double(d) %将字符串转换成数字
alpha=0:pi/20:pi/20*d %⾓度[0,2*pi]
ud=erData; %使⽤obj对象的UserData属性传参
R=ud;%半径
x=R*cos(alpha);
y=R*sin(alpha);
axis equal
%axis([-44 -44])
plot(x,y,'o-')
stop(t)
没有使⽤全局变量,
6、交互设计
6.1 写⼊
字符串写⼊
clear all
clc
prompt = 'What is your string? ';
str = input(prompt,'s')
数字写⼊
clear all
clc
prompt = 'What is the original value? ';
x = input(prompt)
y = x*10
6.2 输出
clear all
clc
A = [15 150];
S = 'Hello World.';
disp(A)
disp(S)
6.3 组合使⽤
clear all
clc
A = input('Input a number:');
disp(['You input number is:',num2str(A)]);
注意,中括号括起来,还有,数字转字符串。
clear all
clc
A = input('Input:','s');
disp(['You input:',A]);。