我在MATLAB中有一个复杂的代码,用于导入和运行旧的fortran代码。
fortran代码运行电解精炼过程并创建许多各种数据的输出文件,但它只执行一次。
我们的目标是让MATLAB多次运行程序,并且每次都要改变元素浓度。
这样做很好。基本上它需要输出文件中的最后一行值(元素权重百分比)并使用这些值更新输入文件,以便下一次运行将从最后一次运行的位置开始。
fortran代码每次运行时都会覆盖输入和输出文件。尝试多次运行时无需复制文件并每次重命名都是一个问题。
MATLAB代码执行此操作:
% Step 1: Reading the data from the output file "outblk1" line by line.
clear tline;
fid = fopen('outblk1');
tline{1}=fgetl(fid);
cont=1;
while ischar(tline{cont})
cont = cont+1;
tline{cont}=fgetl(fid);
end
fclose(fid);
% Step 2: Rewriting the data presented in the output file "outblk1" in
% the file "outblk1_step"
fid = fopen( sprintf( 'outblk1_%i.txt',step), 'w');
for i = 1:(numel(tline)-1)
if tline{i+1} ==-1
fprintf(fid, '%s', tline{i});
break
else
fprintf(fid, '%s\n', tline{i});
end
end
fclose(fid);
这适用于输出文件。除了标题的第一行,一切都是数字。
程序完成后,而不是 outblk1
我明白了 outblk1 outblk1.txt outblk2.txt 等
我想对输入文件做同样的事情。完成所有操作后,我可以访问的是原始输入文件(如果我在运行程序之前保存副本)和最后一个输出文件在最后一个输出文件完成后更新。我希望每个更新的输入文件。所以我这样做了:
% Reading the data from "inpref"
clear tline;
fid = fopen('inpref');
tline{1} =textscan(fid, '%s');
cont=1;
while ischar(tline{cont})
cont = cont+1;
tline{cont}=textscan(fid, '%s');
end
fclose(fid);
% Rewriting the data from "inpref" to "inpref_step"
fid = fopen( sprintf( 'inpref_%i.txt',step), 'w');
for i = 1:(numel(tline)-1)
if tline{i+1} ==-1
fprintf(fid, '%s', tline{i});
break
else
fprintf(fid, '%s\n', tline{i});
end
end
fclose(fid);
我想要的只是每个更新的输入文件的副本。
inpref1.txt inpref2.txt 等等
就像我得到输出文件一样。
我最初尝试使用fget1与输出版本的代码完全相同,但由于输入文件中混合了数据和数字,因此无法正常工作。
我也尝试过这样:
% Reading the data from "inpref"
clear tline;
fid = fopen('inpref');
input =textscan(fid, '%s');
cont=1;
fclose(fid);
% Rewriting the data from "inpref" to "inpref_step"
fid = fopen( sprintf( 'inpref_%i.txt',step), 'w');
fprintf(fid, '%s\n', input);
fclose(fid);
但是我收到了这个错误:
Error using fprintf
Function is not defined for 'cell' inputs.
Error in save_step_data (line 17)
fprintf(fid, '%s\n', input);
我已经查询了有关fprintf,fopen,tline,fget,copyfile,textscan以及其他许多其他内容的MATLAB帮助信息,但它们都引导我对数字做些什么。你不会认为制作一个文件的副本并让它排序是如此困难,这样你就不必为每个循环停止并重命名它。
测序工作正常。我得到inpref1.txt,...,其余的代码工作正常,这是一个文件中的一个,大约10个左右,执行一个有100个或更多部分的fortran代码,一切都很好。 inpref文件本身仍然可以使用新的浓度数据正确更新。
我唯一的问题是该文件的.txt副本完全空白。
我的另一个选择是进入使用新浓度更新输入文件的matlab代码,并找到一种方法来制作一个新文件,其中只有每次附加的浓度值。我还需要每次运行的总质量。这些实际上是整个输入文件中唯一改变的两件事。盐浓度以质量百分比计和盐的总质量。
就个人而言,我认为每次运行输入文件的副本都会更容易。
答案 0 :(得分:0)
如果我理解正确,您只需使用copyfile
制作不同名称的副本,而不是加载和读出文件。如果输入文件被覆盖而不是在每一步更新,movefile
也可以正常工作,但如果fortran程序每次运行时都希望从迭代中找到inpref
,那么你应该坚持使用{{} 1}}。
e.g。
copyfile