fprintf在MATLAB中给我一个空白的.txt文件

时间:2016-01-10 09:25:50

标签: matlab

我在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代码,并找到一种方法来制作一个新文件,其中只有每次附加的浓度值。我还需要每次运行的总质量。这些实际上是整个输入文件中唯一改变的两件事。盐浓度以质量百分比计和盐的总质量。

就个人而言,我认为每次运行输入文件的副本都会更容易。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您只需使用copyfile制作不同名称的副本,而不是加载和读出文件。如果输入文件被覆盖而不是在每一步更新,movefile也可以正常工作,但如果fortran程序每次运行时都希望从迭代中找到inpref,那么你应该坚持使用{{} 1}}。

e.g。

copyfile