2012-01-11 68 views
17

tôi tò mò về sự tiến bộ của chương trình đang chạy và tôi in một số thông tin về phiên hiện nay như:Làm thế nào để xóa dòng cuối cùng trong cửa sổ lệnh

for i = 1:N 
    ... 
    ... 
    msg = sprintf('Processed %d/%d', i, N); 
    display(msg) 
end 

Tôi không muốn để in sự tiến bộ trên các dòng riêng biệt, thay vào đó, tôi muốn dòng cuối cùng thay thế dòng trước đó. Tôi không muốn sử dụng clc để xóa tất cả nội dung.

Tôi biết rằng '\b' có thể xóa ký tự cuối cùng (như backspace) và tôi có thể tạo một hàm với vòng lặp cho phép xóa các mục cho đến dòng mới trước đó trước dòng cuối cùng. Nhưng có cách nào tốt hơn để làm điều đó không? Nếu không, làm thế nào tôi có thể kiểm tra xem ký tự cuối cùng trên dòng lệnh là một dòng mới hay không?

Trả lời

29

Tôi đã xem xét vấn đề này, trước đây. Và tôi đã nhận thấy rằng ký tự \r (được sử dụng để xóa dòng cuối cùng) hoạt động với MATLAB trong dòng lệnh (-nodesktop) nhưng không phải với chế độ đồ họa ...

Giải pháp tốt nhất mà tôi tìm thấy là làm điều gì đó như thế:

n=0; 
for ... 
    ... 
    fprintf(repmat('\b',1,n)); 
    fprintf(msg); 
    n=numel(msg); 
end 
+1

lưu ý: điều này ăn văn bản trước đó của bạn. bạn có lẽ nên lưu độ dài của msg mỗi vòng lặp, và chỉ 'fprintf (repmat ('\ b', 1, lengthLastMsg));' – Julius

2

Đây có phải là về những gì bạn đang tìm kiếm

%# create title 
fprintf('processed: %03d',0) 
for i=1:10 
    %# delete last three digit number and replace with new 
    %# loop index 
    fprintf('\b\b\b\b %03d',i); 

    %# process here 
    pause(.5) 
end 
%# clear line 
fprintf('\n'); 

Nhưng nếu mã của bạn sẽ hiển thị các kết quả khác điều này sẽ không làm việc. và bạn có thể muốn xem xét sử dụng hộp thông báo để cập nhật tiến trình.

17

Yair Altmana very nice example on his blog về cách bạn có thể sử dụng các phím lùi điều khiển nhân vật (\b) để làm những gì bạn muốn nhưng theo một cách dễ dàng hơn bạn đang xem xét. Sửa đổi mã của bạn để giống với ví dụ của anh ấy, bạn có thể làm một cái gì đó như thế này:

reverseStr = ''; 
for i = 1:N 
    ... 
    ... 
    msg = sprintf('Processed %d/%d', i, N); 
    fprintf([reverseStr, msg]); 
    reverseStr = repmat(sprintf('\b'), 1, length(msg)); 
end 
+1

+ Đây là một câu trả lời rõ ràng lớn nhất gnovice, cảm ơn bạn rất nhiều. Tôi khá bối rối nhưng tôi sẽ chấp nhận câu trả lời của Oli cho sự khác biệt tối thiểu 2 phút: S – petrichor

+0

@ İsmailArı: Tôi không hiểu ý bạn là gì "Tôi khá bối rối nhưng tôi sẽ chấp nhận câu trả lời của Oli cho sự khác biệt 2 phút" . – gnovice

+1

Ý tôi là tôi không biết nên chấp nhận điều gì khi hai câu trả lời rất giống nhau. Đây là lần đầu tiên tôi gặp vấn đề này. Cả hai đều rất hữu ích cho tôi. Tôi nên chấp nhận cái nào? Chênh lệch 2 phút là khoảng cách giữa các câu trả lời như tôi thấy. – petrichor

3

Tôi sử dụng chức năng 'dispstat' chỉ cho mục đích này. Nó có thể cập nhật đầu ra trước đó là một chức năng bị thiếu mặc định 'disp'. Rất đơn giản để sử dụng. Nó có thể được tải về từ đây: http://www.mathworks.com/matlabcentral/fileexchange/44673-overwritable-message-outputs-to-commandline-window

*** sử dụng mẫu:

dispstat('','init'); % One time only initialization 
dispstat(sprintf('Begining the process...'),'keepthis','timestamp'); 
for i = 97:100 
    dispstat(sprintf('Progress %d%%',i),'timestamp'); 
    %doing some heavy stuff here 
end 
dispstat('Finished.','keepprev'); 

*** Output:

11:25:37 Begining the process... 
11:25:37 Progress 100% 
Finished. 

Tất cả các

Các vấn đề liên quan