Как очистить последнюю строку в командном окне - PullRequest
19 голосов
/ 11 января 2012

Мне любопытно, как работает запущенная программа, и я печатаю некоторую информацию о текущей итерации, например:

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

Я не хочу печатать прогресс в отдельных строках, вместо этого я хочу, чтобы последняя строка заменяла предыдущую. Я не хочу использовать clc, который очищает весь контент.

Я знаю, что '\b' может очистить последний символ (например, backspace), и я могу создать функцию с циклом for, которая очищает элементы до предыдущей новой строки перед последней. Но есть ли лучший способ сделать это? Если нет, как я могу проверить, является ли последний символ в командной строке новой строкой или нет?

Ответы [ 4 ]

32 голосов
/ 12 января 2012

Я посмотрел на проблему, некоторое время назад.И я заметил, что символ \r (используется для удаления последней строки) работает с matlab в командной строке (-nodesktop), но не с графическим режимом ...

Лучшее решение, которое я нашелэто сделать что-то подобное:

n=0;
for ...
  ...
  fprintf(repmat('\b',1,n));
  fprintf(msg);
  n=numel(msg);
end
19 голосов
/ 12 января 2012

Яир Альтман имеет очень хороший пример в своем блоге того, как вы можете использовать управляющий символ возврата на одну позицию (\b), чтобы делать то, что вы хотите, но более простым способомчем вы думали.Изменив свой код так, чтобы он напоминал его пример, вы можете сделать что-то вроде этого:

reverseStr = '';
for i = 1:N
    ...
    ...
    msg = sprintf('Processed %d/%d', i, N);
    fprintf([reverseStr, msg]);
    reverseStr = repmat(sprintf('\b'), 1, length(msg));
end
3 голосов
/ 12 декабря 2013

Я использую функцию «dispstat» только для этой цели. Он может обновить предыдущий вывод, который является отсутствующей функцией по умолчанию 'disp'. Очень прост в использовании. Его можно скачать здесь: http://www.mathworks.com/matlabcentral/fileexchange/44673-overwritable-message-outputs-to-commandline-window

*** Пример использования:

 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');

*** Вывод:

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

Всего наилучшего

2 голосов
/ 12 января 2012

Это то, что вы ищете

%# 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');

Но если ваш код отображает другие результаты, это не сработает.и вы можете рассмотреть возможность использования окна сообщения для обновления прогресса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...