这个循环有什么问题?在matlab中的FprintF

时间:2017-04-14 15:10:52

标签: matlab file

我有一个循环,应该搜索文件并添加一些文本

fid = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+')
fprintf(fid, 'dsadsado')
for i =1:383

            currentline = fgetl(fid)
            currentline = strtrim(currentline)
            if strcmp(currentline, '$$SOLID_ANORMAL')==1
                fprintf(fid, 'hello')
            elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1
                fprintf(fid, num2str(deltalist(i)))
            else
            end
    i=i+1
end

第2行似乎正确打印到文件中。但是我无法弄清楚为什么第7和第9行不会出现这种情况。当我调试if语句时,代码进入两行并执行它们。当我打开目标文件时,我不明白为什么没有发生任何事情。

2 个答案:

答案 0 :(得分:2)

尝试在MATLAB中主动读取和写入相同的文件是一个坏主意。您反而希望为输出使用不同的文件。

fin = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+');
fout = fopen('wave_propagation_var5_alpha1delta1.CPS_001.out', 'w');

for i =1:383
    currentline = fgetl(fin)
    currentline = strtrim(currentline)
    if strcmp(currentline, '$$SOLID_ANORMAL')==1
        fprintf(fout, 'hello')
    elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1
        fprintf(fout, num2str(deltalist(i)))
    end

    % Print a newline every time to get correspondence
    fprintf(fout, '\n')
    i=i+1
end

fclose(fin)
fclose(fout)

% Replace the input file with the output file if you want
movefile('wave_propagation_var5_alpha1delta1.CPS_001.out', ...
         'wave_propagation_var5_alpha1delta1.CPS_001');

答案 1 :(得分:0)

如@Suever所示,无法同时从同一文件读取和写入。在阅读和写作之间有必要frewindfseek。这是我在下面选择的解决方案。

不是按照拟议的bu @ Suever的答案打开一个新文件进行写作,而是执行以下操作:

1)读取现有文件

2)记住使用ftell

写信的位置

3)倒回文件

4)使用fseekfprintf写入记住的位置:

  fid = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+')
    while ~feof(fid)
        currentline = fgetl(fid)
        currentline = strtrim(currentline)
        if strcmp(currentline, '$$SOLID_ANORMAL')==1
            alphaline = ftell(fid)
        elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1
            deltaline = ftell(fid)
        else
        end
    end

    frewind(fid)
    fseek(fid,alphaline,0)
    fprintf(fid, 'hello')
    frewind(fid)
    fseek(fid,deltaline,0)
    fprintf(fid,num2str(deltalist(i)))

虽然@Suever的答案完全有效且可以接受,但我更喜欢这种方式,因为它充分利用rt+权限来阅读。它绕过了创建另一个要写入的文件的需要,并简单地使用已经存在的文件对其进行必要的更改。