Andrey La solución above es de hecho el mejor enfoque para este problema. Solo quería agregar que lanzar una excepción en el método delete()
podría ser problemático si se trata con matrices de objetos safefopen
. Durante la destrucción de dicha matriz, MATLAB llamará al delete()
en cada elemento de la matriz y, si se lanza delete()
, puede terminar con los sobrantes de los archivos abiertos. Si realmente necesita saber si algo salió mal durante la destrucción, emitir una advertencia sería una mejor opción en mi humilde opinión.
Para aquellos que se sienten vago para escribir todos los métodos de reenvío a cada orden interna de MATLAB que utiliza identificadores de archivos, puede considerar la alternativa simple de la sobrecarga de métodos subsref
para la clase 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
Esta alternativa utiliza el algo ugly feval
, pero tiene la ventaja de funcionar incluso si los chicos de MATLAB (o usted mismo) deciden agregar nuevas funciones que involucren manejadores de archivos, o si el número/orden de los argumentos de entrada a una función determinada cambia. Si usted decide ir a por la alternativa subsref
se debe usar la clase safefopen
así:
myFile = safefopen('myfile.txt', 'w');
myFile.fprintf('Hello World!');
EDIT: Una desventaja de la solución subsref
es que no tiene en cuenta todos los argumentos de salida. Si necesita los argumentos de salida a continuación, tendrá que introducir un poco más la fealdad:
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
Y entonces se podría hacer cosas como:
myFile = safefopen('myfile.txt', 'w');
count = myFile.fprintf('Hello World!');
[filename,permission,machineformat,encoding] = myFile.fopen();
Relacionado estrechamente: [¿Cómo se manejan los recursos en MATLAB de una manera segura y excepcional? (como "try ... finally")] (http://stackoverflow.com/q/1098149/52738) – gnovice