我有一个循环,应该搜索文件并添加一些文本
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语句时,代码进入两行并执行它们。当我打开目标文件时,我不明白为什么没有发生任何事情。
答案 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所示,无法同时从同一文件读取和写入。在阅读和写作之间有必要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+
权限来阅读和。它绕过了创建另一个要写入的文件的需要,并简单地使用已经存在的文件对其进行必要的更改。