Matlab-文件读写操作

1 文件保存save和文件读取load

1.1 save命令

保存当前 MATLAB 工作区内的数据到一个硬盘文件

格式:save filename var1 var2 var3

filename 代表你要保存变量的那个文件,var1,var2 等是要保存的变量。在默认情况下,这个这个文件的扩展名为‘mat’,我们称之为 MAT 文件。如果在 filename 后面无变量,则工作区的所有内容将会被保存。

可以创建.mat文件,也可以创建.dat或.txt文件

1.2 load命令

从硬盘文件加载数据到 MATLAB 当前工作区

格式:load filename

% create an input array from 0 to 10
x=0:0.1:10;
% calculate
y=2*exp(-0.2*x);
%plot result 
%plot(x,y) 

%方式1,存入ascii
save xy_data_ascii.dat x y -ascii
%读取数据到xy_data_ascii中
load xy_data_ascii.dat -ascii

2 fwrite,fread命令

2.1 fwrite

fwrite(fileID,A)
 
fwrite(fileID,A,precision)
 
fwrite(fileID,A,precision,skip)
 
fwrite(fileID,A,precision,skip,machinefmt)
 
count = fwrite(___)

fwrite(fileID,A) 将数组 A 的元素按列顺序以 8 位无符号整数的形式写入一个二进制文件。该二进制文件由文件标识符 fileID 指示。使用 fopen 可打开文件并获取 fileID 值。读取文件后,请调用 fclose(fileID) 来关闭文件。

fwrite(fileID,A,precision) 按照 precision说明的形式和大小写入 A 中的值。

fwrite(fileID,A,precision,skip) 在写入每个值之前跳过skip指定的字节数或位数。

fwrite(fileID,A,precision,skip,machinefmt) 另外还指定将字节或位写入文件的顺序。skip参数为可选参数。

count = fwrite(___) 返回 A 中 fwrite 已成功写入到文件的元素数。您可以将此语法与前面语法中的任何输入参数结合使用。
 

2.2 fread命令

功能

fread函数可从文件中读取二进制数据

语法

A = fread(fid, count)

A = fread(fid, count, precision)

其中fid为指针所指文件中的当前位置,count指读取的数据个数, precision表示以什么格式的数据类型读取数据。

注意:变量是按照顺序存入内存中的,所以读取的时候也需要按顺序,如果有多个变量存储,需要依次指定读取的大小

% create an input array from 0 to 10
x=0:0.1:10;
% calculate
y=2*exp(-0.2*x);
%plot result 
%plot(x,y)
 
%方式2
%save xy,写入格式和读取格式保持一致
[fid,msg]=fopen('xy_data_dat.dat','wt');
if fid>0
    %写入xy,返回数据的个数
    count_xw=fwrite(fid,x,'float32');
    count_yw=fwrite(fid,y,'float32');
    fclose(fid);
else
    %打开失败,显示信息
    disp(fid);
end

%read xy,写入格式和读取格式保持一致
[fid,msg]=fopen('xy_data_dat.dat','rt');
if fid>0
    %读取x,返回读取的数据size(x)=101
     %[x_r,count_xr]=fread(fid,size(x),'*float32');
    [x_r,count_xr]=fread(fid,101,'float32');
    %读取y,返回读取的数据size(y)=101
    %[y_r,count_yr]=fread(fid,size(y),'*float32');
    [y_r,count_yr]=fread(fid,101,'float32');
    fclose(fid);
else
    %打开失败,显示信息
    disp(msg);
end

%%
% 参数	含义
% wt	以文本形式写入
% rt	以文本形式读入
% wb	以二进制形式写入
% rb	以二进制形式读入

3 格式化 I/O 函数

3.1 fprintf写入或打印

规则:

  1. fprintf(fileID,formatSpec,A1,...,An)

  2. fprintf(formatSpec,A1,...,An)

  3. nbytes = fprintf(___)

说明:

fprintf(fileID,formatSpec,A1,...,An) 按列顺序将 formatSpec 应用于数组 A1,...An 的所有元素,并将数据写入到一个文本文件。fprintf 使用在对 fopen 的调用中指定的编码方案。

fprintf(formatSpec,A1,...,An)设置数据的格式并在屏幕上显示结果。

nbytes = fprintf(___)使用前述语法中的任意输入参数返回fprintf所写入的字节数。

A1 = [9.9, 9900];
A2 = [8.8,  7.7 ; ...
      8800, 7700];
formatSpec = 'X is %4.2f meters or %8.3f mm\n';
fprintf(formatSpec,A1,A2)
X is 9.90 meters or 9900.000 mm
X is 8.80 meters or 8800.000 mm
X is 7.70 meters or 7700.000 mm
————————————————
版权声明:本文为CSDN博主「jk_101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jk_101/article/details/106493147

存txt或dat代码:

%%
%准备数据
name(1)="Li Yang";
addr(1)="124 Street";
city_info(1)="ShangHai";
zip(1)="123457";
age(1)=32; 
name(2)="Li Yan";
addr(2)="123 Street";
city_info(2)="BeiJing";
zip(2)="1235711";
age(2)=22; 
%也可以是dat文件
[fileID,msg]=fopen('student_info.txt','w')
if fileID>0 
    fprintf(fileID,'%15s, %15s, %15s, %15s, %15s\n','name','addr','city','zip','age');
    fprintf(fileID,' =================================================================\n'); 
    %此处也可以通过循环进行保存相关变量
    for ii=1:max(size(name))
        fprintf(fileID,'%15s, %15s, %15s, %15s, %15g \n',name(ii),addr(ii),city_info(ii),zip(ii),age(ii));
    end
    fclose(fileID);
else 
    %打开失败,显示信息
    disp(msg);
end

结果:

存txt结果:

存dat结果:

 附件:

存数据:

A = magic(4);
 
fileID = fopen('myfile.txt','w');
nbytes = fprintf(fileID,'%5d %5d %5d %5d\n',A) 
fclose(fileID);

结果:

 
>> type('myfile.txt')

   16     5     9     4
    2    11     7    14
    3    10     6    15
   13     8    12     1

3.2 fscanf读取

格式:

A=fscanf(fid,format) 

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

A为存放读取的数据

count是一个可选的输出参数,返回的值为成功读取元素

format为读取的数据格式

size为A的数据格式,有如下三种:

      inf        一直读到最后结束  
      N         读N个元素放入列向量
      [M,N]  按列顺序读取至少一个M×N矩阵的M * N元素。N可以是inf,但M不能。

读取的文件:

代码示例(1):

[fileID,msg]=fopen('student_info.txt','r')
if fileID>0   
    %获取文件的总行数
    row=0;
    while ~feof(fileID)
        [tests]=fgets(fileID);
        row=row+1;
    end
    %文件指针返回初始位置
    fseek(fileID,0,-1) ;
    %读取第一行
    %header='name,addr,city,zip,age,',count=5
    [header_s, count] = fscanf(fileID, '%s\n',5);
    %读取第二行
    %header_tab='=================================================================',count_2=1
    [header_tab, count_2] = fscanf(fileID, '%s\n', 1); 
    %读取剩下的行数 
    for ii=1:row-2
        [array_s{ii}, count_array{ii}] = fscanf(fileID, '%s\n',7); 
    end
    
    %以','拆分字符串,存储在cell中
    student_info_cell{1,1}=strsplit(header_s,',');   
    for ii=1:row-2 
        student_info_cell{ii+1,1}=strsplit(array_s{ii},',');        
    end    
    %关闭文件
    fclose(fileID);
    %转换为table 
    student_info_table = cell2table(student_info_cell,'VariableNames',{'student_infomation' });
    %转换为数组
    student_info_array= table2array(student_info_table);
    %删除第一行表头
    student_info_array(1,:)=[];
    student_info_table_last=array2table(student_info_array,'VariableNames',{'name','addr','city','zip','age' });
else 
    %打开失败,显示信息
    disp(msg);
end

结果展示:

 

 

4 格式化和二进制I/0文件的读写时间比较

比较格式化和二进制文件的存取时间:

%%
%准备10000个数据测试
out_array=randn(1,10000);

%计算二进制文件操作时间
%复位计时器
tic;
%写10次
for ii=1:10
    %打开或新建文件
    [fid,msg]=fopen('unformatted.dat','w');
    %二进制方式写入数据
    count=fwrite(fid,out_array,'float64');
    %关闭文件
    status=fclose(fid);    
end
%计算二进制写入时间,10次求平均值
time=toc/10;
fprintf('Write time for unformatted file=%6.3f\n',time);

%格式化写入数据时间
%复位计时器
tic;
for ii=1:10
    %打开或新建文件
    [fid,msg]=fopen('formatted.dat','wt');
    %格式化写入数据
    count=fprintf(fid,'%23.15e\n',out_array);
    %关闭文件
    status=fclose(fid);
end
%计算格式化写入时间,10次求平均值
time=toc/10;
fprintf('Write time for formatted file=%6.3f\n',time)

%计算二进制文件读取操作时间
%复位计数器
tic;
for ii=1:10
    %打开二进制文件
    [fid,msg]=fopen('unformatted.dat','r');
    %读取二进制数据
    [in_array.count]=fread(fid,inf,'float64');
    %关闭文件
    status=fclose(fid);
end
%二进制数据读取时间,10次求平均值
time=toc/10;
fprintf ('Read time for unformatted file = %6.3f\n',time); 

%读取格式化文件时间计算
% 初始化计数器
tic; 
% 重复读取10次
for ii = 1:10 
     % 打开格式化文件
     [fid,msg] = fopen('formatted.dat','rt'); 
     % 格式化读取数据
     [in_array, count] = fscanf(fid,'%f',Inf); 
     % 关闭文件
     status = fclose(fid); 
end 
% 10次去平均值时间
time = toc / 10; 
fprintf ('Read time for formatted file = %6.3f\n',time) 

 二进制文件:

 格式化文件:

 结果:

Write time for unformatted file= 0.005
Write time for formatted file= 0.014
Read time for unformatted file =  0.001
Read time for formatted file =  0.016

5 文件位置和状态函数

Matlab读取文件是连续的,但是有时候需要多次读取一段数据,以满足计算的要求。

(1)判断文件是否存在:exist

(2)判断当前数据在文件中的位置:feof,ftell

(3)在文件中移动位置:frewind,fseek

(4)对I/O错误进行描述输出:ferror

5.1 exist 函数

exist 函数用来检测工作区中的变量,内建函数或MATLAB 搜索路径中的文件是否存在。

ident = exist('item'); 
ident = exist('item', 'kind'); 

函数 exist 是非常重要的,因为我们可以利用它判断一个文件否存在fopen 函数中权限运算符“w”和“w+”会删除文件已有的一个文件函数删除一个文件时,它必须征得用户的同意。

函数 exist 的返回值:

 未经用户同意,不要用新数据覆盖原用的文件:

%%
%判断文件是否存在
out_filename = input('Enter output filename: ','s'); 
exist_file=exist(out_filename,'file')
if exist_file
    disp('Output file already exists.');
    yn=input('keep existing file?(y/n)','s');
    if yn=='n'
        fid=fopen(out_filename,'wt');
    else
        fid=fopen(out_filename,'at');
    end
    
else
    %文件不存在
    fid=fopen(out_filename,'wt');
end
%将今天的日期写入文件
fprintf(fid,'%s\n',date); 
status=fclose(fid);

5.2 函数error

进行I\O操作产生错误提示时,可以通过函数ferror得到这些错误提示变量,并把它转化成已于理解的字符信息。

message = ferror(fid) 
message = ferror(fid, 'clear') 
[message, errnum] = ferror(fid) 

 参数“clear”用于清除错误提示。

5.3 函数 foef

函数 feof 用于检测当前文件的位置是否是文件的结尾.,如果是文件的结尾,那么函数返回 1,否则返回 0。

eofstat = feof(fid) 

5.4 函数 ftell

函数 ftell 返回 fid 对应的文件指针读/写的位置。这个位置是一个非负整数,以 byte 为单位,从文件的开头开始计数。返回值-1 代表位置询问不成功。如果这种情况发生了,我们利用 ferror 得知为什么询问不成功。

position = ftell(fid) 

5.5 函数 frewind

函数 frewind 允许程序把文件指针复位到文件的开头,不返回任何状态信息。

frewind(fid) 

5.6 函数 fseek

函数 fseek 允许程序把文件指针指向文件中任意的一个位置.

status = fseek(fid, offset, origin) 

offset:以字节为单位,带有一个正数,用于指向文件的结尾,带有一个负数,用于指向文件的开头

origin :是一个字符串,取值为

-  “bof” 文件的开始位置
-  “cof” 指针中的当前位置
-  “eof” 文件的结束位置

status 的值为 0,如果操作失败 status 为-1。如果 status 为-1,用函数 ferror 判断错误出现在那里

测试:

%%
[fid,msg]=fopen('now.txt','r'); 
%把文件指针设置在文件开始之前的 3 个字节上面
status=fseek(fid,-3,'bof')
if status~=0
    msg=ferror(fid); 
    disp(msg);
end

结果:把文件指针设置在文件开始之前的 3 个字节上面。这是不可能,所以 fseek 将会返回一个-1,用 ferror 得到对应的错误信息。

status =

    -1

偏移量错误 - 文件开始之前。

6 函数uiimport

函数是一种基于 GUI 的方法从一个文件或从剪贴板中获取数据。

uiimport
structure = uiimport;

它支持许多的不同格式,它可以读取任意应用程序保存在剪贴板是的数据。当你想要把数据导入 MATLAB 并对其进行分析时,它的灵活性将会非常地有用。

 

附件:

 

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值