Подтвердить что ты не робот

Как очистить последнюю строку в окне команд

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Yair Altman очень хороший пример в своем блоге о том, как вы может использовать символ управления backspace (\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

Я использую функцию "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.

Все лучшее

Ответ 4

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

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

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