1.处理转义字符。
2.查找限定字符之间的内容。
3.查找限制内容中是否包含const关键字,若存在const关键字,判断其后面定义是变量韩式数组,如是变量则在其前添加volatile关键字,若是数组则不进行任何操作。
4.将处理后的内容重新写入文件。
存在问题1.,将文件用\n按行分割,再用join函数使用\n函数重新连接时,会出现写入字符不处理转义字符的情况。
解决1. 使用compose函数对要写入的字符串进行字符转换,成功解决,不处理转义字符的问题。
存在问题2. 处理文件时发现有其他转义字符’\',此时程序认为该字符为转义字符而不是字符。
解决2.若要保留’\‘字符,在每一行内查找’\‘字符,若该行找到’\‘,则将其替换为双’\'即可。
具体代码如下
clc;
clear all;
prompt = '输入文件夹路径\n';
folderTxt = input(prompt,"s");
fileCInfo = dir([folderTxt '\**\*.c']);
fileHInfo = dir([folderTxt '\**\*.h']);
fileCLen = length(fileCInfo);
fileHLen = length(fileHInfo);
for i = 1 : fileCLen
fileCname =[fileCInfo(i).folder '\' fileCInfo(i).name]
fileContents = fileread(fileCname);
lines = strsplit(fileContents, '\n');
betweenPragmas = false;
for i = 1:length(lines)
line = lines{i};
if contains(line, '\')
line = strrep(line, '\', '\\');
end
if contains(line, '#pragma ghs section rodata=".caldata.a1"')
betweenPragmas = true;
elseif contains(line, '#pragma ghs section rodata=default')
betweenPragmas = false;
end
if betweenPragmas && contains(line, 'const')
constIdx = strfind(line, 'const');
if ~isempty(constIdx) && ~contains(line(constIdx + length('const'):end), '[') && ~contains(line(constIdx + length('const'):end), ']')
volatileConst = [line(1:constIdx-1) 'volatile ' 'const ' line(constIdx+length('const'):end)];
line = volatileConst;
end
end
lines{i} = line;
end
modifiedContent = join(lines, '\n');
str = compose(modifiedContent);
fileID = fopen(fileCname, 'w');
if fileID == -1
error('无法打开文件。');
else
fprintf(fileID, '%s', str{1});
disp(['替换后的内容已成功写入文件:', fileCname]);
end
fclose(fileID);
end