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写入或打印
规则:
-
fprintf(fileID,formatSpec,A1,...,An)
-
fprintf(formatSpec,A1,...,An)
-
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
————————————————
版权声明:本文为优快云博主「jk_101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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 并对其进行分析时,它的灵活性将会非常地有用。
附件: