Андрей решение выше - действительно лучший подход к этой проблеме. Я просто хотел добавить, что создание исключения в методе delete()
может быть проблематичным, если вы имеете дело с массивами safefopen
объектов. Во время уничтожения такого массива MATLAB будет вызывать delete()
для каждого элемента массива и, если выбрасывает delete()
, вы можете получить оставшиеся дескрипторы открытого файла. Если вам действительно нужно знать, что-то пошло не так во время уничтожения, тогда выдача предупреждения будет лучшим вариантом, IMHO.
Для тех, кому лень писать все методы пересылки в каждую встроенную MATLAB, использующую файловые дескрипторы, вы можете рассмотреть простую альтернативу метода перегрузки subsref
для класса 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
Эта альтернатива использует несколько уродливый feval
, но имеет преимущество в том, что работает, даже если парни из MATLAB (или вы сами) решили добавить новые функции, включающие дескрипторы файлов, или если число / порядок входных аргументов в данное изменение функции. Если вы решите пойти на альтернативу subsref
, вам следует использовать класс safefopen
, например:
myFile = safefopen('myfile.txt', 'w');
myFile.fprintf('Hello World!');
EDIT: Недостатком решения subsref
является то, что оно игнорирует все выходные аргументы. Если вам нужны выходные аргументы, вам придется ввести еще несколько уродств:
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
И тогда вы можете делать такие вещи, как:
myFile = safefopen('myfile.txt', 'w');
count = myFile.fprintf('Hello World!');
[filename,permission,machineformat,encoding] = myFile.fopen();