因此,我必须修改.dxf文件(Autocad文件),方法是将其中的某些数据更改为我们之前选择的另一个数据。在Matlab中更改.txt文件的某些行并不是很困难。
但是,当新输入的长度大于旧输入时,我无法更改特定行。
这就是我所拥有的,我只想改变1D57:
TEXT
5
1D57
330
1D52
100
AcDbEntity
8
0
如果我作为输入BBBB,一切都正确,因为两个字符串具有相同的长度。当我尝试使用BBBBbbbbbbbbbb时,同样的情况不适用:
TEXT
5
BBBBbbbbbbbbbb2
100
AcDbEntity
8
0
删除后面的所有内容,直到字符串停止。当输入较短时,它会发生相同的情况:它不会更改新字符串的行,但会在新输入停止之前写入。例如,在我们使用AAA作为输入的情况下,结果将是AAA7。
这基本上就是我用来修改文件的代码:
fID = fopen('copia.dxf','r+');
for i = 1:2
LineToReplace = TextIndex(i);
for k = 1:((LineToReplace) - 1);
fgetl(fID);
end
fseek(fID, 0, 'cof');
fprintf (fID, [Data{i}, '\n']);
end
fclose(fID);
答案 0 :(得分:2)
您需要至少覆盖文件的其余部分才能更改它(除非替换确切的字符数),如jodag的评论中所述。例如,
% String to change and it's replacement
% (can readily be automated for more replacements)
str_old = '1D52';
str_new = 'BBBBbbbbbbbbbb';
% Open input and output files
fIN = fopen('copia.dxf','r');
fOUT = fopen('copia_new.dxf','w');
% Temporary line
tline = fgets(fIN);
% Read the entire file line by line
% Write it to the new file
% Replace str_old with str_new when encountered - note, if there is more
% than one occurence of str_old in the file all will be replaced - this can
% be handled with a proper flag
while (ischar(tline))
% char(10) is MATLAB's newline character representation
if strcmp(tline, [str_old, char(10)])
fprintf(fOUT, '%s \n', str_new);
else
% No need for \n - it's already there as we're using fgets
fprintf(fOUT, '%s', tline);
end
tline = fgets(fIN);
end
% Close the files
fclose(fIN);
fclose(fOUT);
% Copy the new file into the original
movefile 'copia_new.dxf' 'copia.dxf'
在实践中,简单地覆盖整个文件通常要容易得多。
如笔记中所述 - 这可以自动进行更多替换,并且还需要一个额外的标志来仅替换给定的字符串一次。