Andrey La soluzione above è davvero l'approccio migliore a questo problema. Volevo solo aggiungere che il lancio di un'eccezione nel metodo delete()
potrebbe essere problematico se si gestiscono array di oggetti safefopen
. Durante la distruzione di tale array, MATLAB chiamerà delete()
su ogni elemento dell'array e, se ci sono dei lanci delete()
, si potrebbe finire con gli handle di file aperti rimanenti. Se davvero hai bisogno di sapere se qualcosa è andato storto durante la distruzione, emettere un avvertimento sarebbe una scelta migliore.
Per coloro che si sentono pigro per scrivere tutti i metodi di inoltro ad ogni integrato MATLAB che utilizza gli handle di file, si può considerare la semplice alternativa del metodo di subsref
sovraccarico per la classe safefopen
:
methods(Access=public)
function varargout = subsref(this, s)
switch s(1).type
case '.'
if numel(s) > 1,
feval(s(1).subs, this.fid, s(2).subs{:});
else
feval(s(1).subs, this.fid);
end
% We ignore outputs, but see below for an ugly solution to this
varargout = {};
otherwise
varargout{1} = builtin('subsref', this, s);
end
end
end
Questa alternativa utilizza la po brutto feval
, ma ha il vantaggio di funzionare anche se i ragazzi di MATLAB (o te stesso) decidono di aggiungere nuove funzioni che coinvolgono gli handle di file o se il numero/ordine degli argomenti di input per una determinata funzione cambia. Se si decide di andare per la subsref
alternativa poi si dovrebbe utilizzare la classe safefopen
come questo:
myFile = safefopen('myfile.txt', 'w');
myFile.fprintf('Hello World!');
EDIT: Uno svantaggio della soluzione subsref
è che non tiene conto tutti gli argomenti di uscita. Se avete bisogno degli argomenti di output allora si dovrà introdurre un po 'di bruttezza:
methods(Access=public)
function varargout = subsref(this, s)
if nargout > 0,
lhs = 'varargout{%d} ';
lhs = repmat(lhs, 1, nargout);
lhs = ['[' sprintf(lhs, 1:nargout) ']='];
else
lhs = '';
end
switch s(1).type
case '.'
if numel(s) > 1,
eval(...
sprintf(...
'%sfeval(''%s'', this.fid, s(2).subs{:});', ...
lhs, s(1).subs) ...
);
else
eval(...
sprintf('%sfeval(''%s'', this.fid);', ...
lhs, s(1).subs) ...
);
end
otherwise
varargout{1} = builtin('subsref', this, s);
end
end
end
E allora si potrebbe fare le cose come:
myFile = safefopen('myfile.txt', 'w');
count = myFile.fprintf('Hello World!');
[filename,permission,machineformat,encoding] = myFile.fopen();
Strettamente correlati: [Come gestite le risorse in MATLAB in modo eccezionalmente sicuro? (come "prova ... finalmente")] (http://stackoverflow.com/q/1098149/52738) – gnovice