Andrey 's giải pháp above thực sự là cách tiếp cận tốt nhất cho vấn đề này. Tôi chỉ muốn thêm rằng ném một ngoại lệ trong phương pháp delete()
có thể có vấn đề, nếu bạn đối phó với mảng của các đối tượng safefopen
. Trong quá trình hủy bỏ một mảng như vậy, MATLAB sẽ gọi delete()
trên mỗi phần tử mảng và, nếu có bất kỳ số phát nào là delete()
thì bạn có thể kết thúc với các nút xử lý tệp còn mở. Nếu bạn thực sự cần phải biết liệu có gì sai trong quá trình hủy diệt thì việc đưa ra một cảnh báo sẽ là một lựa chọn tốt hơn IMHO.
Đối với những người cảm thấy lười biếng để viết tất cả các phương pháp chuyển tiếp đến từng được xây dựng trong MATLAB sử dụng xử lý tập tin, bạn có thể xem xét việc thay thế đơn giản của phương pháp subsref
quá tải cho các lớp học 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
Phương án này sử dụng hơi xấu xí feval
, nhưng có lợi thế là làm việc ngay cả khi những kẻ MATLAB (hoặc chính bạn) quyết định thêm các chức năng mới liên quan đến xử lý tập tin, hoặc nếu số/thứ tự của các đối số đầu vào cho một thay đổi hàm đã cho. Nếu bạn quyết định đi cho subsref
thay thế thì bạn nên sử dụng lớp safefopen
như thế này:
myFile = safefopen('myfile.txt', 'w');
myFile.fprintf('Hello World!');
EDIT: Một nhược điểm của giải pháp subsref
là nó không quan tâm đến tất cả các đối số đầu ra. Nếu bạn cần các đối số đầu ra sau đó bạn sẽ phải giới thiệu một số xấu xa hơn:
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
Và sau đó bạn có thể làm những việc như:
myFile = safefopen('myfile.txt', 'w');
count = myFile.fprintf('Hello World!');
[filename,permission,machineformat,encoding] = myFile.fopen();
Liên quan chặt chẽ: [Làm thế nào để bạn xử lý tài nguyên trong MATLAB một cách ngoại lệ an toàn? (như “cố gắng… cuối cùng”)] (http://stackoverflow.com/q/1098149/52738) – gnovice