任务:
在程序开始读入.txt文件中的参数值,在程序运行结束后将调整的参数存入这个txt文档中,以供下次使用。
实现:
1. 将参数存在txt文档,格式如下:
每行列出一个参数,并且以参数值、逗号、参数名的格式,即:“ [参数] , [参数名] ”。
2. 从txt读取——函数fopen(filepath)、textscan(fileID, readformat)、fclose(fileID)
filename = 'paras.txt';%文件路径
fileID = fopen(filename);%在MATLAB后台打开文件
C = textscan(fileID,'%f %s ','Delimiter',',');%读。读取的C为1x2的cell格式数据
fclose(fileID);%读完后即关闭文件
D=[num2cell(C{1}),C{2}];%整理数据结构。(将读取的两列文件组成一个新的cell数据D)
读取操作主要用到了三个函数:
fopen(filepath) —— 打开路径下的txt文档,打开后返回一个fileID,用此来操作打开的文档;
textscan(fileID, readformat) ——matlab推荐的读取txt文档的函数,第一参数是上一步获得fileID;第二个参数是读取的格式,这里用到的格式是'%f %s','%f'表示读取浮点数值,'%s'表示读取字符串;第三个参数为可选格式类型( 'Delimiter', ',' ) ,表示浮点数值和字符串数值之间由','逗号间隔。当然读取的格式并不局限于此,更多的格式参照最后一部分“txt文件的格式”。
fclose(fileID) —— 对文件操作完成后,关闭fileID指向的文件,此步非常必要,建议读取完成需要的内容后执行此步。防止程序意外中断后,文件无法进行修改和操作。
通过以上,读取到一个cell类型的变量C,它由一个double类型的数组和一个cell类型的变量组成。
为了方便后续对数据的修改,通过最后一行代码将C的结构重新整合成一个如下结构的cell变量D 👇。修改后的D在索引时和矩阵的索引方式相同,只是需要采用大括号,例如D{i, j}。
3. 修改参数并写入txt:
①采用函数writercell直接将D写入:
D{index,1}=value;%对由index索引行的参数进行修改
writecell(D,'paras.txt');%写入。此步不需要用fopen打开文件,直接将cell数据写入txt文件
% type(filename);%不用打开文件,在命令窗口打印txt文件内容。(此步并不是必须的)
②采用fprintf函数,逐个写入数据:
fileId=fopen('paras1.txt','wt');%以写入权限的方式打开文件
[m,n]=size(D);
for i=1:m
for j=1:n
if j==n
fprintf(fileId,'%s\n',D{i,j});%每行的第二个字符写入后利用\n回车
else
fprintf(fileId,'%f,',D{i,j});%每行的数字写入后,后添加逗号,与后面的字符串相隔
end
end
end
fclose(fileId);%关闭文件
txt文件的格式:
C = textscan(fileID,'%s %n %n %n %n', 'Delimiter',',', 'TreatAsEmpty',{'NA','na'}, 'CommentStyle','//');
'%s %n %n %n %n': 为字符的类型和排列方式。所有的类型有:
%d:有符号整数
%u:无符号整数
%f:浮点数
%s:字符串
%c:单个字符
%D:时间和日期
%n:自然数
'Delimiter':此项设置字符之间分割的符号,此处设置分割符号为:','
'TreatAsEmpty':此项设置视为空的字符,此处设置为{'NA','na'},即遇到'NA'或'na'时不读入
'CommentStyle':此项设置注释符号,此处设置为'//'双斜线,即双斜线之后的内容视为注释(也不读入)。
更多格式可以参考官方文档:https://ww2.mathworks.cn/help/matlab/ref/textscan.html
这里是童小喵,趟大家没趟的坑,写大家都爱看的文。欢迎点赞支持~喵~