• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB——文件读写(1)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1、文件打开关闭

(1)文件打开

fid=fopen(文件名,打开方式
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
 ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
 ‘a’:在打开的文件末端添加数据。文件不存在则创建。
 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
另外,在这些字符串后添加一个“t”,如‘rt’‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。

 

(2)关闭文件
文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:

stafclose(fid)
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1

如果要关闭所有已打开的文件用fclose(‘all’)

 

2、二进制文件的读写操作

(1)写二进制文件
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:
COUNTfwritefidAprecision
说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:charucharintlongfloatdouble等。缺省数据精度为uchar,即无符号字符格式。

a=[1 2 3 4 5 6 7 8 9];
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函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
[ACOUNT]=fread(fidsizeprecision)
说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[MN](读数据到M×N的矩阵中,数据按列存放)。 precision用于控制所写数据的精度,其形式与fwrite函数相同。

clear all
a=[1 2 3 4 5 6 7 8 9];
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=[1 2 3 4 5 6 7 8 9];
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函数可以将数据按指定格式写入到文本文件中。其调用格式为:

fprintffidformatA
说明:fid为文件句柄,指定要写入数据的文件,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等,与fscanf函数相同,A是用来存放数据的矩阵。

clear all
a=[1 2 3 4 5 6 7 8 9];
fid=fopen(\'C:\Users\Administrator\Desktop\MATLAB\test.txt\',\'w\')
fprintf(fid,\'%f\',a)
fclose(fid)

控制精度

clear all
a=[1 2 3 4 5 6 7 8 9];
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函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:

[ACOUNT]=fscanf(fidformatsize)
说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[MN](读数据到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;
t.UserData=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=obj.UserData;  %使用obj对象的UserData属性传参
R=ud;%半径
x=R*cos(alpha);
y=R*sin(alpha);
axis equal
%axis([-4 4 -4 4])
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]);

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab如何创建带标记的线图发布时间:2022-07-18
下一篇:
[原创]Delphi小工具(Windows资源管理器右键菜单扩展)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap