zoukankan      html  css  js  c++  java
  • MATLAB——文件读写(1)

    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:UsersAdministratorDesktopMATLAB	est.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
    ing wangDesktopMATLAB	est.txt','rb')%读取'r'
    [A,COUNT]=fread(fid,'double')
    fclose(fid)

    从二进制返回到double类型数组。

    一定要注意读取的格式,否则返回的类型会发生变化

    clear all
    fid=fopen('C:UsersAdministratorDesktopMATLAB	est.txt','rb')
    
    [A,count]=fread(fid)
    
    fclose(fid)

    将读写整合在一个程序里

    clear all
    a=[1 2 3 4 5 6 7 8 9];
    fid=fopen('C:UsersAdministratorDesktopMATLAB	est.txt','wt')
    fwrite(fid,a,'double')
    fclose(fid)
    
    fid1=fopen('C:UsersAdministratorDesktopMATLAB	est.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:UsersAdministratorDesktopMATLAB	est.txt','w')
    fprintf(fid,'%f',a)
    fclose(fid)

    控制精度

    clear all
    a=[1 2 3 4 5 6 7 8 9];
    fid=fopen('C:UsersAdministratorDesktopMATLAB	est.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
    ','x','exp(x)');% 
    fprintf(fileID,'%6.2f %12.8f
    ',A);
    fclose(fileID);

    可以看到换行符,可以看到长度,可以看到小数位数,都是右对齐,按列取数,按行排列、可以看出记事本和ultra显示的差异

     

    clear all
    x = 0:.1:1;
    A = [x; exp(x)];%矩阵
    
    fileID = fopen('exp.txt','w'); %打开,写入
    fprintf(fileID,'%6s %12s
    ','x','exp(x)');
    fprintf(fileID,'%6.2f %12.8f
    ',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:UsersAdministratorDesktopMATLAB	est1.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
    ',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
    ',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 '
    '])
    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 '
    '])
    fprintf(fileID,'%6s%6s%6s
    ','日期','时间','星期');
    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,['日期' '       '  '时间'  '       '  '星期 ' '
    '])
    %fprintf(fileID,'%6s%6s%6s
    ','日期','时间','星期');
    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]);
    

  • 相关阅读:
    直线型一阶倒立摆5---硬件平台搭建
    PE view---重要参数--C语言实现
    A1132. Cut Integer
    A1131. Subway Map (30)
    A1130. Infix Expression
    A1129. Recommendation System
    A1128. N Queens Puzzle
    A1127. ZigZagging on a Tree
    A1126. Eulerian Path
    A1125. Chain the Ropes
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/7507547.html
Copyright © 2011-2022 走看看