这个循环有什么问题?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
。上面的代码有效吗?如果是这样的话,那就是我唯一改变的事情,因此这就是问题所在。