Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个循环有什么问题?matlab中的FprintF_Matlab_File - Fatal编程技术网

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

这个循环有什么问题?matlab中的FprintF,matlab,file,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, '$$

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

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语句时,代码进入两行并执行它们。当我打开目标文件时,我不明白为什么什么都没有发生。

在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');

如@Suever所示,不可能同时从同一个文件读写。有必要在读写之间选择
frewind
fseek
。这就是我在下面选择的解决方案

它没有像bu@Suever的回答那样打开一个新文件进行编写,而是执行以下操作:

1) 读取现有文件

2) 使用
ftell

3) 倒带文件

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

  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+
的读写权限。它绕过了创建另一个要写入的文件的需要,只需使用现有文件对其进行必要的更改。

您正在尝试同时从同一文件读取和写入。。。写入一个与您正在读取的文件不同的文件。是的,但这将打印到输出文件中与输入文件中不同的位置,对吗?假设“$$SOLID\u normal”出现的那一行就在下面,比如第200行。当它被if语句检测到,并且我打印到fout时,它将在fout中的当前位置打印,这与fin中的当前位置不同。在这种情况下,为什么在Matlab文档中它为fopen提供了一个读写(r+)选项?如果这是一个坏主意,为什么他们要将其作为权限之一?@user32882然后每次打印一个换行。请参阅更新。@user32882从文件读写没有问题。你只是不想同时做这两件事。您正在交错执行这两个操作,这将导致这两个操作都出现问题。@user32882问题在于您可以有一个文件句柄,从中读取,
frewind
it,然后
fwrite
。上面的代码有效吗?如果是这样的话,那就是我唯一改变的事情,因此这就是问题所在。