前言
日常学习的过程中使用了matlab读写txt文件,记录一下基本函数的使用,本文主要介绍了
fopen
、fclose
和fprintf
几个函数,这些主要是面向txt格式的文件保存数据。还有其他几个函数,比如fread
和fwrite
,用过但是他们是针对写二进制文件的,写在txt文件中会出现乱码,所以这里就不介绍了。
前面是对fopen
、fclose
和fprintf
函数的介绍,后面给了一个我的自建demo可以运行
fopen
的基本语法:
fid = fopen(filename, permission)
如果fid=-1,说明打开失败,查看文件是否存在。
如果文件以文本格式打开,那么一个“t”就应加入到 permission 字符串中(例如“rt”或“rt+”)。
fid = fopen('file.txt','r')
权限(permission)字符串是“r”,它指出这个文件的打开方式为只读。找不到文件会报错
注意这样打开的是二进制文件,不是txt文件。默认是二进制,permission我们用的是’r’,其实是‘rb’。
使用txt文件最常用的语句!
fid = fopen('file.txt','wt')
权限(permission)字符串是“wt”,它指出这个文件的打开方式为写入,指定这个文件为新建文本文件。如果这个文件已存在,那旧文件就会被删除,打开新建的文件等待写入数据。如果我们要替换先前已存在的数据,那么就可以采用这个形式。
fid = fopen('file.txt','at')
权限(permission)字符串是“at”,它指出这个文件的打开方式为写入,指定一个我们想要增加数据的文本文件。如果这个文件已经存在了,那么它将会被打开,新的数据将会添加到已存在的数据中。如果我们不想替换已存在的数据,那么就可以采用这个方式。
fid = fopen('file.txt', 'r+')
权限(permission)字符串是“r+”,它指出这个文件的打开方式为读写,找不到文件会报错。
fid = fopen('file.txt','w+')
权限(permission)字符串是“w+”,它指出这个文件的打开方式为读写,指定这个文件为新建文本文件。如果这个文件已存在,那旧文件就会被删除,打开新建的文件等待写入数据。如果我们要替换先前已存在的数据,那么就可以采用这个形式。
fid = fopen('file.txt','a+')
好的编程习惯
在使用 fopen 语句时,一定要注意指定合适的权限,这取决于你是要读取数据,还是要写入数据。好的编程习惯可以帮助你避免(类似于覆盖的)错误。
在文件打开操作后检查它的状态以确保它被成功打开。如果文件打开失败,提示用户解决方法。
fclose
把以户自定义格式编写的格式化数据写入一个文件。它的形式为
status = fclose(fid)
status = fclose('all')
其中 fid 为文件标识,status 是操作结果,如果操作成功,status 为 0,如果操作失败,status 为-1。
函数 status = fclose(‘all’)关闭了所有的文件,除了 stdout(fid = 1)和 stderr(fid = 0)。如果所有的文件关闭成功,status 将为 0,否则为-1。
fprintf
函数用于进行写入字段,类似于C语言的printf函数,语法很好懂,我这里使用的是下面的格式写入到我的txt文件当中。
count = fprintf(fid, format, val1, val2, ...)
fprintf(format, val1, val2, ...)
其中fid是我们要写入数据那个文件的文件标识,format是控制数据显示的字符串。如果fd丢失,数据将写入到标准输出设备(命令窗口)。这些格式已经在第二章介绍过。
格式(format)字符串指定队列长度,小数精度,域宽和输出格式的其他方面。它包括文字数字字符(%)和字符序列(用于指定输出数据显示的精确格式)。一个典型的数据输出格式字符串图81所示。字符%总是标志着格式化字符串的开始,在字符%之后,这字符串应包括一个标识(fg),一个域宽,一个精度指定符和一个转换指定符。字符%,转换指定符一般会要求出在任何格式中,而标识,域宽,精度指定符是可选的。
可能的转换指定符
还是用之前的图:
如果我们用格式化字符串指定域宽和精度,那么小数点前的数就是域宽,域宽是所要显示的数所占的字符数。小数点后的数是精度,是指小数点后应保留的位数。这样说不直观,我们看一些例子:
显示十进制整数数据要用到%d 格式转换指定符。如果需要的话,d 可能出现在标识(flag),域宽和精度指定符之前。如果有用的话,精度指定符可以指定要显示的数据的最小数字个数,如果没有足够多的数字,那么 MATLAB 将在这个数之前添加 0。
如果用格式指定符%d 显示一个非十进制数,这个指定符将会被忽略,这个数将会以科学计算法格式显示。例如
fprintf('%6d\n',123.4)
将产生结果 1.234000e+002。
浮点数数据的显示要用到%e,%f。,%g 格式转换指符。如果需要的话,这些格式转换指符可能出现在标识(flag),域宽和精度指定符之前。如果指定的域宽太小了,不能显示这个数,则这个域宽是无效的。否则,则应用指定的域宽。
字符数据的显示要用到%e,%c 格式转换指符。如果需要的话,这些格式转换指符可能出现在标识(flag),域宽和精度指定符之前。如果指定的域宽太小了,不能显示这个数,则这个域宽是无效的。否则,则应用指定的域宽。
注意:
应该保证 fprintf 函数中的数据类型与格式字符串中的格式转换指定符的类型要一一对应,否则将会产生意料之外的结果。
日常需要写一个测试,测试不同参数下的各种指标,然后把指标输出到txt文件中,按照
function txt_write_condition(txtName,para,mode)
filename=[txtName,'.txt'];
fileID = fopen(filename,mode);
fprintf(fileID,'parameter=%f\n',para);
fprintf(fileID,'%s:','Max error');
fclose(fileID);
end
function txt_write_data(txtName,para)
filename=[txtName,'.txt'];
fileID = fopen(filename,'a+');
fprintf(fileID,'%f\n\n',para);
fclose(fileID);
end
n=10;%做10次测试,写一个for循环
para=linspace(0.1,1.0,10);%测试10个参数的指标
for k=1:n
txtname = 'res1';%定义文件的名字,txt文件为res1.txt,可以自定义
if k==1
mode='w+';%写入模式,原来有res1.txt文件覆盖重新写入
else
mode='a+';%继续后面的写入,不要覆盖原来的文件
end
%读写txt函数初始化:写入参数条件
txt_write_condition(txtname,para(k),mode);
%%%%%%%%%%%%%%%%%%
%%%假设获取了指标最大运行时间:max_time
max_time=exp(k);
%%%%%%%%%%%%%%%%%%
txt_write_data(txtname,max_time);
end
结果
fopen
、fclose
和fprintf
函数的说明摘录自,比起matlab文档要详细很多,希望对大家有帮助!!!
[1] S.J.Chapman《MATLAB编程》中文版