需求
我用Matlab寫代碼時候,經常想把許多重複性的操作寫成函數,但是在Matlab有工作空間裏可能存在命名衝突的問題,比如寫一個畫矩形的函數rectangle,Matlab裏已經有這個函數了,一個解決的辦法是把這些自己寫的函數都放到一個類裏去當做靜態函數調用,函數前面加上類名,就不會衝突了。
類裏寫靜態函數的方法有兩個:
- 直接在類定義文件,即有classdef的文件裏寫
classdef sp
methods (Static)
function [] = func1()
end
function [] = func2()
end
end
end
像上面這樣寫,就可以寫很多個函數,調用的時候只要用sp.func1就行了。但這樣會存在一個問題,如果函數的代碼量很大的話,再把這些函數都寫在類定義文件裏就顯得臃腫。
2. 在類定義文件放在@class文件夾裏,上面的就寫@sp,在@sp文件夾裏寫的函數就只有sp類才能調用了,
假設func1.m裏寫了函數
function [] = func1()
end
那只要在類定義文件里加上
classdef sp
methods (Static)
[] = func1()
end
end
就可以了,但是這樣又有一個問題,假如函數的聲明發生了變化,我又得把改變了的函數聲明拷貝到類定義文件裏,非常麻煩。所以我就想寫一m文件,把改變了的函數聲明用代碼寫到類定義文件裏。
實現思路
將類定義文件sp.m中放函數聲明的前面加上一句註釋begin_of_out_file,末尾加一句註釋end_of_out_file
判斷是否含有某個字符串
contains(str1,str2)
讀取文本文件的行
tline = fgetl(fid)
一行一行讀下來,發現有begin_of_out_file的時候,將@sp文件夾下的所有m文件讀進來
funcList = dir([input_path,'/*.m']);
func_str = '';
for k = 1:length(funcList)
if strcmp(funcList(k).name,name)==0&&...
strcmp(funcList(k).name,new_name)==0
fid = fopen(fullfile(funcList(k).folder,...
funcList(k).name),'r');
tline = fgetl(fid);
tline = strrep(tline,'function ',repmat(' ',1,8));
func_str = sprintf('%s%s\n',func_str,tline);
end
end
刪除字符串
tline = erase(tline,'function ');
替換字符串
tline = strrep(tline,'function ',repmat(' ',1,8));
讀取所有函數的第一行,將function替換成空格,再寫到新文件中去,同時,begin_of_out_file和end_of_out_file之間的將摒棄掉。
注意事項
- 爲了防止寫錯,留了個備份文件
- 本來最後想用movefile用新文件替換舊文件的,但報錯文件正在使用
完整代碼
clear;close all;clc
%%
input_path = 'E:\MatlabCode\Resonator\code\@sp\';
%%
name = 'sp.m';
new_name = 'sp_1.m';
orgname = fullfile(input_path, name);
dstname = fullfile(input_path, new_name);
backup_name = fullfile(input_path,'sp.txt');
copyfile(orgname,backup_name);
fr = fopen(orgname,'r');
fw = fopen(dstname,'w');
%%
while true
tline = fgetl(fr);
if tline == -1
break;
end
flag = contains(tline,'begin_of_out_file');
if ~flag
fprintf(fw,'%s\r\n',tline);
else
fprintf(fw,'%s\r\n',tline);
funcList = dir([input_path,'/*.m']);
func_str = '';
for k = 1:length(funcList)
if strcmp(funcList(k).name,name)==0&&...
strcmp(funcList(k).name,new_name)==0
fid = fopen(fullfile(funcList(k).folder,...
funcList(k).name),'r');
tline = fgetl(fid);
tline = strrep(tline,'function ',repmat(' ',1,8));
func_str = sprintf('%s%s\n',func_str,tline);
end
end
fprintf(fw,'%s\r\n',func_str);
while 1
tline = fgetl(fr);
flag = contains(tline,'end_of_out_file');
if flag == 1
fprintf(fw,'%s\r\n',tline);
break;
end
end
end
end
%%
fclose(fr);
fclose(fw);
%%
movefile(dstname,orgname)